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

问题描述 投票:0回答:1

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

python-2.7 ubuntu python-multiprocessing
1个回答
0
投票

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

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

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

您可以在multiprocessing documentation中阅读有关流程启动策略的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.