【python】GIL是什么?

Python GIL 系列之通过实例认识Python的GIL 1. 请看下面的例子: import time from threading import Thread from multiprocessing import Process from timeit import Timer def countdown(n):     while n > 0:         n -= 1 def t1():     COUNT=1000000 阅读详情

GIL:全局解释器锁

1. python 的解释器分为 CPython(默认解释器)和 JPython,由于历史原因,在 CPython 上难以移除 GIL

2. 每个线程执行是都需要先获取 GIL,保证同一时刻只有一个线程可以执行代码,所以 python 的多线程并不是真正的多线程,不能利用多核的 CPU 资源,但多进程可以利用多核的 CPU 资源。

3. 线程释放 GIL:在 IO 操作等可能会引起阻塞的 system call 之前,可以暂时释放 GIL,但在执行完毕之后,必须重新获取 GIL

4. 多线程并不是鸡肋,存在即合理。例如爬虫时多线程比单线程性能有所提升,因为遇到 IO 阻塞会自动释放 GIL

5. 避免 GIL:在 python 中可以将核心模块通过 c/c++ 实现,通过 python 来调用 c/c++,从而能绕开 GIL,让程序能够高效运行。

使用 C 语言来解决 GIL 问题

把一个c语言文件编译成一个动态库的命令(linux平台下):

gcc xxx.c -shared -o libxxxx.so

用一个 C 语言实现子线程死循环:

void DeadLoop()
{
    while(1)
    {
        ;
    }
}   

python 实现主线程死循环:

from ctypes import *
from threading import Thread

#加载动态库
lib = cdll.LoadLibrary("./libloop.so")

#创建一个子线程,让其执行c语言编写的函数,此函数是一个死循环
t = Thread(target=lib.DeadLoop)
t.start()

#主线程
while True:
    pass

        
Python GIL锁 于是有了GIL这把超级大锁,而当越来越多的代码库开发者接受了这种设定后,他们开始大量依赖这种特性(即默认python内部对象是thread-safe的,无需在实现时考虑额外的内存锁和同步操作)。为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据一致性和状态同步的困难。所以虽然 CPython 的线程库直接封装操作系统的原生线程,但 CPython 进程做为一个整体,同一时间只会有一个获得了 GIL 的线程在跑,其它的线程都处于等待状态等着 GIL 的释放。 阅读详情

相关推荐

python的GIL锁(非常详细)

在了解python异步IO的过程中,接触到了python的GIL锁,找了许多国内外的资料,阅读完后发现较于其他博客中的说法有了更深的一些了解,因此写了这篇博客来进行记录,本文中的部分内容引用自real python,感觉是讲得最好的一份资料。 https://realpython.com/python-gil/ 一、GIL锁简介 简而言之,Python全局解释器锁或GIL是一种互斥锁(或锁),仅允许一个线程持有Python解释器的控制权。 这意味着在任何时间点只能有一个线程处于执行状态。对于执行单线程程

谈笑的博客 1万+

python——GIL锁详解

对于IO密集型应用,即便有GIL存在,由于IO操作会导致GIL释放,其他线程能够获得执行权限。由于多线程的通讯成本低于多进程,因此偏向使用多线程。对于计算密集型应用,由于CPU一直处于被占用状态,GIL锁直到规定时间才会释放,然后才会切换状态,导致多线程处于绝对的劣势,此时可以采用多进程+协程。

python全栈 8479

Python的GIL详解

GIL详解 GIL全称global interpreter lock,全局解释器锁,是 Python 解释器中的一个布尔值,受到互斥保护。这个锁被 CPython 中的核心字节码用来评估循环,并调节用来执行语句的当前线程。 每个线程在执行的时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU。执行单线程程序的开发人员看不到GIL的影响,但它可能是CPU绑定...

Alkaid的博客 4610

python——全局解释器锁(GIL)

顾名思义,就是正在运行中的程序。是操作系统中分配任务的最小基本单元;线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己不拥有系统资源;但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

python全栈 6817

【Python】 GIL

在深入Python多线程的细节之前,我们必须首先建立对并发(Concurrency)与并行(Parallelism)这两个核心概念的清晰理解。它们常常被混淆使用,但在计算机科学中,尤其是在讨论多核处理器和程序执行时,它们具有截然不同的含义。理解这两者是掌握任何并发编程范式的基石,也是理解Python中GIL存在必要性的前提。并发,从本质上讲,是关于**如何处理多个任务(或看起来同时执行的多个任务)**的能力。它侧重于管理,而不是真正意义上的同时执行。一个单核CPU也可以实现并发,通过快速切换任务(上下文切换

宅男很神经 1190

【Python】GIL

在深入GIL的运作机制之前,我们必须理解其诞生的历史背景和设计哲学。Python作为一种高级编程语言,其核心解释器CPython(最常用、官方的Python实现)最初并非为原生多线程并行计算而设计。它的设计者Guido van Rossum在早期面临着一个关键权衡:易用性与并发性。核心考量点:内存管理与引用计数: CPython内部采用了一种简单而高效的内存管理机制——引用计数。每个Python对象内部都有一个引用计数器。当有新的引用指向该对象时,计数器加一;当引用失效时,计数器减一。当计数器归零时,对象内

宅男很神经 1399

Python 基础:深入了解Python中的GIL(全局解释器锁)(上篇)

熟悉 Python 的人理应都听过 GIL(Global Interpreter Lock,全局解释器锁) ,大概也知道它就是造成 Python 多线程并发其实是「伪并行」的核心原因,但依旧很多人没有深入其中,所以 HackPython 尝试以上、下两篇文章来阐释 GIL,分别从其表现现象、对应源码以及 Python 对 GIL 改进等方面进行讨论。

艽野尘梦的博客 990

上不皦下不昧,ABAP 开发里的隐形秩序与可升级之道

摘要 《道德经》第十四章中「其上不皦,其下不昧」的哲学思想,可以很好地指导现代ABAP开发实践。在SAP S/4HANA、ABAP Cloud等现代开发环境中,优秀的系统应做到:业务层不被技术细节灼伤(上不皦),底层实现保持清晰可见(下不昧);系统各组件间保持连续稳定的关系(绳绳兮不可名);最终让技术复杂度退居幕后,使业务顺畅运行(复归于无物)。这体现在:业务代码应专注表达意图而非技术实现;底层依赖必须基于发布契约而非随意访问;扩展应采用Clean Core原则而非污染核心。这种工程修养使系统既易于维护又稳

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1524

什么是Python全局锁(GIL),如何避开GIL限制?

Python 全局解释器锁(Global Interpreter Lock, 简称GIL) 是一个互斥锁(或锁),只允许一个线程保持 Python 解释器的控制权。这意味着在任何时间点都只能有一个线程处于执行状态。执行单线程程序的开发人员看不到 GIL 的影响,但它可能是 CPU 密集型和多线程代码中的性能瓶颈。本文介绍了3种避开全局锁限制的方法:多进程编程,Cython, 其它解释器

Python技术探索 2万+

RV1126上YOLOv8部署实战:从模型转换到板端推理的完整避坑指南

本文提供了在瑞芯微RV1126芯片上部署YOLOv8目标识别算法的完整实战指南。内容涵盖从模型转换、环境搭建到板端推理代码编写的全流程,重点解析了RKNN-Toolkit使用、量化配置、内存优化及后处理实现等关键环节的常见问题与解决方案,旨在帮助开发者高效避坑,实现边缘AI应用的稳定落地。

pz89012345的博客 568

永磁同步电机自抗扰控制ADRC(位置环/速度环控制器)Matlab/Simulink仿真(S-Function)

ESO是ADRC的核心,其作用是跟踪被控对象的输出,同时给出受控对象的各阶状态变量以及系统总扰动的实时估计,将其补偿到控制器中,实现动态补偿线性化。NLSEF采用非线性函数把TD产生的跟踪及微分信号与ESO给出的状态变量估计值之间的误差进行非线性组合得到初级控制量,然后同总扰动的补偿量一起生成最终的控制信号。自抗扰控制(ADRC)技术的核心思想是将简单的积分串联型视为标准模型,把系统模型中不同于标准型的部分和外部干扰之和视为总扰动,并将其扩张为一个新的状态。看作系统内外部扰动之和。令一个高阶状态变量为。

m0_66341377的博客 7615

对 Python 中 GIL 的理解

Python 中的全局解释器锁(Global Interpreter Lock,GIL)是 CPython 解释器的一个机制,用来确保在多线程环境下,只有一个线程可以执行 Python 字节码,任何时刻只能有一个线程在执行 Python 代码。这意味着,即使有多个 CPU 核心,Python 的多线程程序在同一时间也只有一个线程在执行,无法充分利用多核处理器的优势。

NLP工程化 2195

C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

我们的今天的目标就是:用C语言来实现一个贪吃蛇项目,也不用太复杂,初学者能看懂就行!

致力于C语言C++知识分享! 1万+

python中的GIL详解

python中的GIL详解 GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行

qq_33934427的博客 3076

Cadence HDL原理图库避坑指南:从Excel导入引脚到解决‘V- V+’报错(附FPGA实例)

本文详细介绍了Cadence HDL原理图库的高效构建与排错方法,重点讲解如何从Excel智能导入引脚数据并优化FPGA封装设计。通过数据预处理、智能导入和深度排错三个关键阶段,帮助工程师避免常见错误如‘V- V+’报错,提升设计效率和准确性。

weixin_28739079的博客 236

量子计算入门指南:密度算符的核心概念与应用解析

本文深入解析了量子计算中密度算符的核心概念与应用。作为描述量子系统“状态的状态”的关键数学工具,密度算符能有效处理混合态与子系统描述,是理解量子噪声、量子纠错和开放系统演化的基石。文章通过对比纯态与混合态,阐释了密度矩阵的数学定义与物理意义,并结合代码示例演示了其在实际量子计算问题中的强大威力。

day7的博客 469

python GIL 详解

GIL 对 CPU 密集型任务有明显限制,多线程无法实现真正的并行。多线程适合 I/O 密集型任务,因为线程可以在等待 I/O 时释放 GIL。多进程是绕过 GIL 的有效方法,适用于需要充分利用多核 CPU 的场景。C 扩展模块(如 numba)可以帮助开发者规避 GIL 的限制,提高性能。

软件架构师笔记 1271

【新能源汽车测试工程师必看!DBC文件50条实战技巧,看懂这篇直接封神】

如果你是新能源汽车研发/测试工程师,还在为信号解析错误、报文找不到、DBC看不懂、实车故障复现不了头疼——那这篇文章,你一定要!在整车电控开发里,DBC = CAN总线的官方字典。没有DBC,报文就是一串乱码;读不懂DBC,测试寸步难行;用不好DBC,排查故障全靠猜。本文总结50条全网最实用、最贴近实车、最能解决问题的DBC技巧,从基础语法到新能源专用信号,从工具操作到故障排错,全部来自一线台架、实车、高压平台实战经验。不废话、不空谈、不玄学,全是能直接落地的硬货!

优快云-新能源汽车研发测试专业博主 1371

python的GIL锁

GIL锁

qq_45822672的博客 1635

Origin教程004:Origin图形导出

需要编辑的话,双击图形,会自动用origin软件打开图形,这种方式是最开始导出图形的功能,方式一和二都是后面增加的。如果导出的图片边距较大的时候,会影响图片的美观,可以通过。也可以设置在PPT中直接编辑,找到。解决方法是,选择一条线,

WwLK123的博客 6332

面向元数据的 SAP UI 中枢:namespace sap.ui.mdc 全景解析

如果把应用前端比作一条数据到交互的装配线,sap.ui.mdc 就是那条线的标准化工装:以 PropertyInfo 描述原料,以 Delegate 定义装配方法,以 p13n 与 VariantManagement 交付面向个体的最终产物;而 Condition Model、Operator 与 ValueHelp 则让输入与筛选的语义落地。与 OData V4 服务与 Fiori Elements 宏构件组合使用时,它能在保持一致体验的同时,给自由式开发者留下足够的可编排空间。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 238

2024年最全python中的GIL详解_gil数据

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

2401_84584763的博客 1576

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python gil原理_Python GIL深入浅出

概述GIL(Global Interpreter Lock)是什么东东?为什么当一些Pythoners在开发一些多线程操作的时候,都会有些很多疑问?多线程真的很糟糕吗?我该如何实现多线程并发操作?今天博主带你详细的介绍一下GIL。GIL原理由于Python是动态解释性语言,即解释运行。运行Python代码时都会通过Python解释器解释执行,Python官方默认的解释器是Cython,当然你...

weixin_33168794的博客 294

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python中的GIL详解_gil数据

于是有了GIL这把超级大锁,而当越来越多的代码库开发者接受了这种设定后,他们开始大量依赖这种特性(即默认python内部对象是thread-safe的,无需在实现时考虑额外的内存锁和同步操作)。只是顺序的执行两次,模拟单线程。为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据一致性和状态同步的困难。但是无法改变的是GIL的存在使得操作系统线程调度的这个本来就昂贵的操作变得更奢侈了。按照之前的分析,即使是有GIL全局锁的存在,串行化的多线程也应该和单线程有一样的效率才对。

2501_90425046的博客 1385

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python GIL

GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的...

MISAYAONE的博客 327
下一篇: from 和 import 导入的区别
Waspvae
博客等级 码龄10年 34粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值