怎么看 Python 运行多线程时的 GIL,这东西是 Python“伪多线程”的死穴么?

2016-08-01 08:47:18 +08:00
 northisland
说点看书的体会,欢迎讨论~



Python 白皮儿书——《 Python 核心编程第二版》,里讲:


对 Python 虚拟机的访问由全局解释器锁( Global Interpreter Lock , GIL )来控制,正式这个锁,能保证同一时刻只有一个线程运行。
"

看完 18.3.1 ,感觉, Python 代码不能实现多个 CPU 共同快跑,只能一次运行一个线程,虽然开了多个线程,但 GIL 强制一次只执行一个(做爬虫的同事说, Python 爬虫只能让一个 CPU 吃饱,和其他 CPU 无关)

换言之, Python 是把多线程的执行模型,强行退化到 1 个 CPU ,退化到流水线处理模式。


但是, 18.3.1 最后一段,的意思,我的理解是:
这种 Python “多线程”,会让 I/O 操作在阻塞时间内,通过 GIL 切换到其他线程。
所以,对某些界面操作,硬件调用,是有用的。
但纯用 Python 代码,想完成计算方向的并行,是没有卵用的。




2830 次点击
所在节点    问与答
6 条回复
virusdefender
2016-08-01 09:31:36 +08:00
IO 密集型使用多线程

CPU 密集型使用多进程
tabris17
2016-08-01 09:38:16 +08:00
Python 的多线程意义在于:在等待 IO 的时候可以让 CPU 去执行别的代码
Tinet
2016-08-01 09:40:37 +08:00
“这种 Python “多线程”,会让 I/O 操作在阻塞时间内,通过 GIL 切换到其他线程。”

感觉这个跟协程的调度很像啊
ryd994
2016-08-01 09:47:46 +08:00
其实对于纯 C 的部分, GIL 是不影响的,所以也可以写个多线程的 C 模块
lammps
Arnie97
2016-08-01 13:50:56 +08:00
“并发”不代表“并行”。计算密集型应用要另寻他法,比如多进程。
northisland
2016-08-01 15:17:56 +08:00
@Arnie97
@virusdefender

有什么 Python 多进程方面的资料么?多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/296239

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX