我在我的程序中使用multiprocess.Pool,如:
def funA(dict,pool):
dosomething()
pool.app_async(somethingInDict)
if __name__==__main__:
inf={}
pool=Pool(4)
process=Process(target=funA,args=(inf,pool))
process.start()
这在使用python 2.7的Ubuntu 17.04中正常工作,但在使用python 2.7的Windows 10中,我收到一个错误:NotImplementedError:池对象无法在进程之间传递或被pickle。
我理解这个错误是因为在进程之间传递的对象需要被pickle而池不能被pickle,但是我想知道为什么这个程序可以正常运行在ubuntu 17上。这是关于Windows和Linux的不同内核吗?
答案 0 :(得分:0)
Unix和Windows在创建流程方面有所不同。
Unix使用fork
原语创建父进程的克隆。创建Process
对象时,参数将通过继承传递,因为子进程具有父进程的虚拟地址空间的副本。
spawn
策略创建一个全新的流程并在其中加载新的Python解释器。由于地址空间完全不同,必须将参数序列化并通过pipe
发送到子进程。
您可以在multiprocessing documentation中详细了解流程启动策略。