Windows下面的multiprocessing跟Linux下面略有不同,Linux下面基于fork疗我,fork之后所有的本地變量都復(fù)制一份爆袍,因此可以使用任意的全局變量屿岂;在Windows下面,多進程是通過啟動新進程完成的坏为,所有的全局變量都是重新初始化的究驴,在運行過程中動態(tài)生成慨仿、修改過的全局變量是不能使用的。multiprocessing內(nèi)部使用pickling傳遞map的參數(shù)到不同的進程纳胧,當(dāng)傳遞一個函數(shù)或類時镰吆,pickling將函數(shù)或者類用所在模塊+函數(shù)/類名的方式表示,如果對端的Python進程無法在對應(yīng)的模塊中找到相應(yīng)的函數(shù)或者類跑慕,就會出錯万皿。當(dāng)你在Interactive Console當(dāng)中創(chuàng)建函數(shù)的時候,這個函數(shù)是動態(tài)添加到main模塊中的核行,在重新啟動的新進程當(dāng)中不存在牢硅,所以會出錯。當(dāng)不在Console中芝雪,而是在獨立Python文件中運行時减余,你會遇到另一個問題:由于你下面調(diào)用multiprocessing的代碼沒有保護,在新進程加載這個模塊的時候會重新執(zhí)行這段代碼惩系,創(chuàng)建出新的multiprocessing池位岔,無限調(diào)用下去。解決這個問題的方法是永遠把實際執(zhí)行功能的代碼加入到帶保護的區(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)中加載的時候這行保證下面的代碼不會執(zhí)行抒抬。
轉(zhuǎn)自鏈接:https://www.zhihu.com/question/39032759/answer/107049302