关于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)。
轉載于:https://www.cnblogs.com/laresh/p/9583695.html
總結
以上是生活随笔為你收集整理的关于python的GIL的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Integer的==问题
- 下一篇: 【C#】VS2017 winform 打
