Python中大的一把锁

今天可以来讲解下GIL是个什么了。

GIL为什么是Python中大的一把锁?

GIL是Global Interpreter Lock的缩写,翻译过来就是全局解释器锁。

从字面上去理解,它就是锁在解释器头上的一把锁,它使Python代码运行变得有序。

假如有一段代码:

复制代码
print(1)print(2)print(3)print(4)print(5)print(6)

运行之后,

复制代码
123456

GIL通过确保在任何给定时间只运行一个线程来防止竞争条件


GIL确保在任何给定时间只有一个线程在运行。
因此,不可能利用具有线程的多个处理器。


由于CPython的内存管理不是线程安全的,GIL可以防止竞争条件并确保线程安全。

突破GIL的封锁

更换解释器

Python有多个解释器实现。分别用C、Java、C#和Python编写的CPython、Jython、IronPython和PyPy是受欢迎的。

GIL 仅存在于CPython的原始Python实现中。


那为什么不直接使用别的解释器为主要开发用呢?
因为CPython的库为丰富。
如果别的解释器有支持你代码中的模块,那是可以直接移植过去使用的。
像Jython至今还没有推出Python3,只停留在Python2时代。

用多进程替代多线程

我将用三段代码(单线程、多线程、多进程)解决一个问题(把50000000通过n-=1减至0)。

通过对比他们运行的所花费的时间,看哪段代码效率高。

「单线程」

复制代码
import timenum = 50000000def countdown(n):    while n>0:        n -= 1start = time.time()countdown(num)end = time.time()print('花费时间 -', end - start)

运行结果:

复制代码
花费时间 - 3.7478301525115967

「多线程」

复制代码
import timefrom threading import Threadnum = 50000000def countdown(n):    while n>0:        n -= 1t1 = Thread(target=countdown, args=[num//2])t2 = Thread(target=countdown, args=[num//2])start = time.time()t1.start()t2.start()t1.join()t2.join()end = time.time()print('花费时间 -', end - start)

运行结果:

复制代码
花费时间 - 4.2221999168396

「多进程」

复制代码
from multiprocessing import Poolimport timenum = 50000000def countdown(n):    while n>0:        n -= 1if __name__ == '__main__':    pool = Pool(processes=2)    start = time.time()    r1 = pool.apply_async(countdown, [num//2])    r2 = pool.apply_async(countdown, [num//2])    pool.close()    pool.join()    end = time.time()    print('花费时间 -', end - start)

运行结果:

复制代码
花费时间 - 2.307600975036621

对于**「计算密集型任务」**,Python的多线程比单线程还慢,

这是由于线程的创建和销毁都要消耗资源(进程消耗资源更大)。

「对比单线程和多线程就能感受到GIL这个枷锁的束缚力了。」

用了多进程后,运行速度一下子从3.73缩短到2.30秒,证明多进程还是能突破GIL的封锁的。


多进程底层是开了多个解释器去运行代码,一个进程一把GIL。

相关推荐
神仙别闹2 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
Y幽谷客2 小时前
Python加载本地大模型(Qwen3.5 8B)
python·大模型
伞伞悦读3 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
线上放牧人3 小时前
Windows删除图标缓存
windows·python·pyqt
qq_5470261794 小时前
Python 变量和简单数据类型
python
智搜广告5 小时前
智搜广告:科技行业AI回答优化公司如何破局
大数据·python·elasticsearch·geo
IpdataCloud5 小时前
AI智能体调用工具怎么核验来源IP?归属地、网络类型与代理风险识别(含Python代码)
数据库·python·tcp/ip
2601_966949656 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
蒸鱼Yuzheng6 小时前
Python 游戏测试开发怎么准备:日志解析、接口校验、并发与可维护性
自动化测试·python·测试开发·面试题·游戏测试
m0_734571766 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g