Python 2.7 Windows和Ubuntu上Multiprocess池的不同行为

时间:2017-12-26 08:48:23

标签: python-2.7 ubuntu python-multiprocessing

我在我的程序中使用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的不同内核吗?

1 个答案:

答案 0 :(得分:0)

Unix和Windows在创建流程方面有所不同。

Unix使用fork原语创建父进程的克隆。创建Process对象时,参数将通过继承传递,因为子进程具有父进程的虚拟地址空间的副本。

相反,Windows使用spawn策略创建一个全新的流程并在其中加载新的Python解释器。由于地址空间完全不同,必须将参数序列化并通过pipe发送到子进程。

您可以在multiprocessing documentation中详细了解流程启动策略。