Python3 線程

Windows下面的multiprocessing跟Linux下面略有不同,Linux下面基于fork,fork之后所有的本地變量都復(fù)制一份,因此可以使用任意的全局變量;在Windows下面,多進(jìn)程是通過啟動(dòng)新進(jìn)程完成的,所有的全局變量都是重新初始化的,在運(yùn)行過程中動(dòng)態(tài)生成、修改過的全局變量是不能使用的。multiprocessing內(nèi)部使用pickling傳遞map的參數(shù)到不同的進(jìn)程,當(dāng)傳遞一個(gè)函數(shù)或類時(shí),pickling將函數(shù)或者類用所在模塊+函數(shù)/類名的方式表示,如果對(duì)端的Python進(jìn)程無法在對(duì)應(yīng)的模塊中找到相應(yīng)的函數(shù)或者類,就會(huì)出錯(cuò)。當(dāng)你在Interactive Console當(dāng)中創(chuàng)建函數(shù)的時(shí)候,這個(gè)函數(shù)是動(dòng)態(tài)添加到main模塊中的,在重新啟動(dòng)的新進(jìn)程當(dāng)中不存在,所以會(huì)出錯(cuò)。當(dāng)不在Console中,而是在獨(dú)立Python文件中運(yùn)行時(shí),你會(huì)遇到另一個(gè)問題:由于你下面調(diào)用multiprocessing的代碼沒有保護(hù),在新進(jìn)程加載這個(gè)模塊的時(shí)候會(huì)重新執(zhí)行這段代碼,創(chuàng)建出新的multiprocessing池,無限調(diào)用下去。解決這個(gè)問題的方法是永遠(yuǎn)把實(shí)際執(zhí)行功能的代碼加入到帶保護(hù)的區(qū)域中:

from multiprocessing import Pool
def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)
    r=pool.map(f, range(100))
    pool.close()
    pool.join() 

注意if __name__ == '__main__'這一行,當(dāng)模塊從import當(dāng)中加載的時(shí)候這行保證下面的代碼不會(huì)執(zhí)行。

轉(zhuǎn)自鏈接:https://www.zhihu.com/question/39032759/answer/107049302

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,614評(píng)論 0 13
  • 我跟著她的腳步走進(jìn)了一座宅院中,這座宅院的年紀(jì)比我大出了好幾十重,墻上的每一道痕里不知裹了多少年的雨和風(fēng),像一個(gè)閱...
    王書著閱讀 330評(píng)論 0 0
  • 明天,明天還有明天嗎?有誰(shuí)能準(zhǔn)確告訴我,我們明天在哪里? 我小心翼翼,千思萬(wàn)想,小心謹(jǐn)慎,戰(zhàn)戰(zhàn)赫赫,如履薄冰的去想...
    看得到我嗎閱讀 550評(píng)論 0 2
  • 今天的兩個(gè)家風(fēng)的智慧,教養(yǎng),給我深深的感動(dòng),我想成為一個(gè)美麗,智慧,善良的人,懂得堅(jiān)持為何物的人。 ...
    沐星之星星閱讀 505評(píng)論 0 0
  • 最近好像陷入了知識(shí)焦慮,導(dǎo)致自己成了個(gè)瘋狂囤積課程的倉(cāng)鼠,每天想做的事情很多,真正做好的卻很少。 前兩天,聽一位異...
    機(jī)會(huì)本人閱讀 367評(píng)論 2 0

友情鏈接更多精彩內(nèi)容