亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python線程全部在單個內核上執行

Python線程全部在單個內核上執行

阿晨1998 2019-10-11 10:21:34
我有一個Python程序,該程序產生許多線程,一次運行4個,每個線程執行一個昂貴的操作。偽代碼:for object in list:    t = Thread(target=process, args=(object))    # if fewer than 4 threads are currently running, t.start(). Otherwise, add t to queue但是,當程序運行時,OS X中的活動監視器顯示4個邏輯內核中的1個處于100%的狀態,而其他邏輯內核中的接近0個。顯然,我不能強迫OS做任何事情,但是我從來沒有做過以前請注意這樣的多線程代碼的性能,所以我想知道我是否只是缺少或誤解了某些東西。
查看完整描述

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應用程序的更好方法。


查看完整回答
反對 回復 2019-10-11
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

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


查看完整回答
反對 回復 2019-10-11
  • 3 回答
  • 0 關注
  • 980 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號