关于python的GIL
转自依云在知乎上的回答,链接为https://www.zhihu.com/question/27245271/answer/462975593 侵删。
python的多线程,其实不是真的多线程,它会通过GIL来控制线程,导致不管有多少个核,其实在同一时间只有一个线程在跑。
在python程序中调用cpp的库创建的线程是否受制于GIL? - 依云的回答 - 知乎 https://www.zhihu.com/question/27245271/answer/462975593在python程序中调用cpp的库创建的线程是否受制于GIL? - 依云的回答 - 知乎 https://www.zhihu.com/question/27245271/answer/462975593Python 的多线程是真的多线程,只不过在任意时刻,它们中只有一个线程能够取得 GIL 从而被允许执行 Python 代码。其它线程要么等着,要么干别的和 Python 无关的事情(比如等待系统 I/O,或者算点什么东西)。在python程序中调用cpp的库创建的线程是否受制于GIL? - 依云的回答 - 知乎
Python 的多线程是真的多线程,只不过在任意时刻,它们中只有一个线程能够取得 GIL 从而被允许执行 Python 代码。其它线程要么等着,要么干别的和 Python 无关的事情(比如等待系统 I/O,或者算点什么东西)。
上述的观点是错误的,Python 的多线程是真的多线程,只不过在任意时刻,它们中只有一个线程能够取得 GIL 从而被允许执行 Python 代码。其它线程要么等着,要么干别的和 Python 无关的事情(比如等待系统 I/O,或者算点什么东西)。
GIL 是为了保护 Python 数据不被并发访问破坏,所以当你不访问 Python 的数据的时候自然就可以释放(或者不取得)GIL。反过来,如果需要访问 Python 的数据,就一定要取得 GIL 再访问。
PyObject 等不是线程安全的。多线程访问任何非线程安全的数据都需要先取得对应的锁。Python 所有的 PyObject 什么的都共享一个锁,它就叫 GIL。
Python 的多线程是可以并发的,只不过是因为锁的使用导致了通常情况下的并行度不是很高。所有多线程所具备的特点它全部具备:抢占式、由 OS 调度、并发、无顺序、需要锁、容易死锁或者破坏数据。同一时刻只有一个线程在执行字节码并不意味着它只能同时干一件事(不需要的时候,比如等待 OS、在 C 代码部分执行计算,可以释放 GIL)。