3 回答

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

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