为什么GIL不阻止Python I/O绑定任务?

Ter*_*non 35 python multithreading

蟒蛇线程 文档指出"......线程仍然是一个合适的模型,如果你想同时运行多个I/O密集型任务",这显然是因为I/O密集型进程能够避免,防止线程并发执行的GIL CPU绑定任务.

但我不明白的是I/O任务仍然使用CPU.那怎么能不遇到同样的问题呢?是因为I/O绑定任务不需要内存管理吗?

Ale*_*lli 36

所有Python的阻塞I/O原语在等待I/O块解析时释放GIL - 就这么简单!他们当然需要在继续执行更多Python代码之前再次获取GIL,但是对于他们只是等待一些I/O系统调用的长期机器周期间隔,他们不会不需要GIL,所以他们不坚持下去!

  • @Shashank,没有 - 我已经获得了"自然编码"Python与C++ I/O绑定代码的基准测试,而Python绝对围绕C++运行 - 两倍,三倍.删除GIL总是非常快,除非你有更多的线程对你有好处,否则它会再次快速获取它! (3认同)

use*_*740 23

在CPython的GIL 1关心执行Python代码.只要不需要与Python运行时交互,使用大量CPU的线程安全C扩展可能会释放GIL.

一旦C代码需要与Python"交谈"(读取:回调到Python运行时),那么它需要再次获取GIL - 也就是说,GIL是为"解释器"建立保护/原子行为(我使用松散的术语,并不是为了防止本机/非Python代码同时运行.

周围释放I/O(阻塞或不使用CPU与否)的GIL是同样的事情-直到数据被移动的Python没有理由获取GIL.


1 GIL存在争议,因为它可以防止多线程CPython程序在某些情况下充分利用多处理器系统.请注意,在GIL之外发生可能阻塞或长时间运行的操作,例如I/O,图像处理和NumPy数字运算.因此,只有多线程程序在GIL中花费大量时间来解释CPython字节码,GIL才成为瓶颈.