3 回答

TA貢獻1789條經驗 獲得超10個贊
請注意,在許多情況下(幾乎所有情況下,“昂貴的操作”都是使用Python實現的計算),由于Python的全局解釋器鎖定(GIL),多個線程實際上不會并發運行。
GIL是解釋程序級別的鎖。此鎖定可防止在Python解釋器中一次執行多個線程。每個要運行的線程都必須等待另一個線程釋放GIL,這意味著您的多線程Python應用程序本質上是單線程的,對嗎?是。不完全是。有點。
CPython在幕后使用了所謂的“操作系統”線程,也就是說,每次發出創建新線程的請求時,解釋器實際上就會調用操作系統的庫和內核以生成新線程。例如,這與Java相同。因此,在內存中您確實確實有多個線程,并且通常操作系統會控制計劃運行哪個線程。在多處理器機器上,這意味著您可能有多個線程分布在多個處理器上,所有線程都高興地放棄工作。
但是,盡管CPython確實使用了操作系統線程(理論上允許多個線程在解釋器中同時執行),但解釋器還強制GIL由線程獲取,然后它才能訪問解釋器并進行堆棧并可以修改內存中的Python對象。一切都是故意的。后一點是GIL存在的原因:GIL防止多個線程同時訪問Python對象。但是,這并不能使您(如銀行示例所示)免于成為對鎖敏感的生物。你不會搭便車。GIL可以保護翻譯人員的記憶,而不是您的理智。
有關更多詳細信息,請參見Jesse Noller的帖子的“ Global Interpreter Lock”部分。
要解決此問題,請查看Python的multiprocessing模塊。
多個進程(明智地使用IPC)是一種為線程編寫多CPU應用程序的更好方法。

TA貢獻1802條經驗 獲得超5個贊
AFAIK,在CPython中,全局解釋器鎖定意味著在任何一次運行的Python代碼塊不能超過一個。盡管這實際上并不會影響單個處理器/單核計算機上的任何內容,但是在多核計算機上,這意味著您實際上一次只能運行一個線程-導致所有其他內核都處于空閑狀態。
添加回答
舉報