理解python GIL 全局锁

来源:互联网 发布:量子计算处理器 知乎 编辑:程序博客网 时间:2024/05/22 02:04

众所周知,python中有全局解释器锁,由于全局解释器锁的存在,所以在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能。

在python,使用的都是操作系统级别的线程,因此在linux中 python使用的是pthread 在windows下也是使用的Windows的原生线程来实现。

python GIL 之所以会影响多线程等性能,是应为在多线程的情况下,只有当线程获得了一个全局锁的时候,那么该线程的代码才能运行,而全局锁只有一个,所以使用python多线程,在同一时刻也只有一个线程在运行,因此在即使在多核的情况下也只能发挥出单核的性能。

既然python在同一时刻下只能运行一个线程的代码,那线程之间是如何调度的呢?
对于有io操作的线程,当一个线程在做io操作的时候,因为io操作不需要cpu,所以,这个时候,python会释放python全局锁,这样其他需要运行的线程就会使用该锁。
对于cpu密集型的线程,比如一个线程可能一直需要使用cpu做计算,那么python中会有一个执行指令的计数器,当一个线程执行了一定数量的指令时,该线程就会停止执行并让出当前的锁,这样其他的线程就可以执行代码了。
由上面可知,至少有两种情况python会做线程切换,一是一但有IO操作时,会有线程切换,二是当一个线程连续执行了一定数量的指令时,会出现线程切换。当然此处的线程切换不一定就一定会切换到其他线程执行,因为如果当前线程 优先级比较高的话,可能在让出锁以后,又继续获得锁,并优先执行。

linux下 python使用的是 pthread 和 有一个互斥量和一个 条件变量来实现全局锁功能。

下面是参考文档的下载地址该文档由python cookbook的作者编写,有很高的参考价值http://download.csdn.net/detail/tuxl_c_s_d_n/8677825
0 0