python的GIL

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

在Cpython解释器中(cpyhton是大多数python版本的解释器),全局锁GIL是个互斥体,它阻止多个本地线程同时执行Python字节码。这个锁是很有必要的,主要因为cpython的内存管理不是线程安全的。(然而,因为GIL的存在,其他的特性强制依赖于这个特性。)

GIL的只是一种概念,存在于Cpython解释器中,其他python解释器如Jpython是没有的。GIL并不是Python的特性,Python完全可以不依赖于GIL。

在多核心的情况下,多线程的执行可能比单线程还要慢

Python的多线程在多核CPU上,只对于IO密集型计算产生正面效果;而当有至少有一个CPU密集型线程存在,那么多线程效率会由于GIL而大幅下降。

如何避免GIL的影响?

用multiprocess替代Thread

multiprocess库的出现很大程度上是为了弥补thread库因为GIL而低效的缺陷。它完整的复制了一套thread所提供的接口方便迁移。唯一的不同就是它使用了多进程而不是多线程。每个进程有自己的独立的GIL,因此也不会出现进程之间的GIL争抢。

当然multiprocess也有缺点。它的引入会增加程序实现时线程间数据通讯和同步的困难。对于数据共享来说,只能通过在主线程申明一个Queue,put再get或者用share memory的方法。线程的之间的数据共享比进程要快很多。

参考:http://python.jobbole.com/81822/

你可能感兴趣的:(python的GIL)