Python GIL
一个Python解释器同一时间只有一个线程在执行。
在CPython中有全局解释器锁(GIL,Global Interpreter Lock)。线程的 一个执行周期 需要完成获取GIL,执行,释放GIL三个步骤。如果一个线程获取了GIL但是还没有释放,那在这个时间段内其它线程就没有办法执行。这也是为什么说 一个Python解释器同一时间只能有一个线程在执行。
在线程执行过程中,如下情况会释放GIL(使用线程处理任务会经过线程的多个执行周期):
- 当遇到I/O操作(read、write、send、recv等)时释放GIL。
- 对于不执行I/O操作的情况。执行
sys.getcheckinterval()
次“tick”后检查是否需要释放GIL。
同一时间只能有一个线程在执行。那是不是就像网上有种说法:“Python多线程是鸡肋” ?。
初学Python的时候看到一些说法:Python多线程反而会让程序更慢;Python不能充分利用多核CPU。
- 说Python不能充分利用多核CPU。其实可以通过开多进程来利用多核CPU。
- 在单核CPU上说用多线程会让程序变慢。对于计算密集型的任务是会变慢,但是对于I/O密集型的任务,多线程还是会让CPU的利用率变高。
参考资料
- YouTube: understanding the Python GIL By David Beazley (PPT)
- 视频开始举了一个计数的例子,用while循环实现从1亿开始倒数。在使用两个线程时,时间不但没减半反而增加了。作者只是用来引出GIL。
- 我不觉得GIL不好。