为什么Python的全局解释器锁GIL会影响多核性能_解析并发受限原因

落静酱_6706

落静酱_6706

2026-06-04

690人浏览

原创

gil使python多线程在cpu密集型任务中无法利用多核,仅io阻塞时能并发;multiprocessing可绕过但开销大;c扩展(如numpy)自动释放gil;gil是cpython兼容性取舍,非bug。

为什么python的全局解释器锁gil会影响多核性能_解析并发受限原因

Python的GIL不会“影响”多核性能——它直接让多核在纯Python计算中失效。 你写10个threading.Thread去跑矩阵乘法,监控top或htop会发现:CPU使用率卡死在100%(单核满载),其余核心几乎闲置。这不是配置问题,是CPython解释器的硬性限制。

为什么GIL让threading在CPU密集场景完全无效

GIL本质是一把全局互斥锁,强制所有Python字节码串行执行。哪怕你有32核CPU,threading启动32个线程,它们仍得排队抢同一把锁才能执行Python代码。

  • 每次线程执行约100条字节码后,CPython自动释放GIL并尝试切换——但这不是并行,是快速轮询,上下文切换反而增加开销
  • 你在for i in range(10**7)里做纯算术?GIL全程不放,其他线程干等
  • 用dis.dis()反编译函数能看到大量LOAD_FAST、BINARY_ADD等字节码指令,每一条都在GIL保护下执行

threading什么时候能用?只看IO是否阻塞

GIL在遇到系统调用(如read()、recv()、time.sleep())时会主动释放,此时其他线程可立即抢到锁继续执行。这是唯一能发挥threading价值的场景。

Visily
Visily

Visily是一款面向产品团队的 AI UI 设计、线框图和原型制作工具。

下载
  • 典型有效用例:requests.get()发HTTP请求、open().read()读大文件、socket.accept()收连接
  • 错误直觉:“我加了time.sleep(0.1),线程就能并发?”——错。sleep是显式让出GIL,但若主线程没IO操作,只是空循环+sleep,仍是单核打满
  • 验证方法:用strace -f -e trace=epoll_wait,read,write python script.py观察是否真触发系统调用

multiprocessing绕过GIL的代价和边界

每个multiprocessing.Process拥有独立解释器和内存空间,自然不受GIL制约——但进程创建/通信成本远高于线程。

  • 数据传递必须序列化:Queue、Pipe、Manager底层走pickle,传大数组比共享内存慢一个数量级
  • 频繁跨进程调用函数(如Pool.map()处理小任务)可能比单线程还慢,因为fork+序列化开销压倒计算收益
  • 真正受益的场景:任务粒度大、计算时间远超IPC开销,例如单次运行>100ms的数值运算

别忽略C扩展和替代解释器的实际效果

NumPy、Pandas、cv2等库内部用C实现,调用时自动释放GIL;PyPy虽仍有GIL但JIT优化大幅降低其影响;Jython无GIL但生态断层严重。

  • 检查C扩展是否释放GIL:grep -r "Py_BEGIN_ALLOW_THREADS" /path/to/site-packages/numpy/
  • 用sys._current_frames()查各线程状态,若大量线程卡在select或epoll_wait,说明GIL已释放,正在真并发等待IO
  • CPython 3.13起实验性支持--disable-gil构建,但需重编译且现有C扩展大概率崩溃——目前仅适合科研验证,勿用于生产

最常被忽略的一点:GIL不是bug,是CPython为兼容海量现存C扩展和引用计数内存模型做的取舍。想突破它,要么切进程,要么交出Python字节码控制权(进C/Cython/NumPy),要么换解释器——不存在“关掉GIL就变快”的银弹。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1791

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4724

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1749

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

28097

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3387

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3387

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2623

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习