无法在多处理中pickle类型“module”。p

2024-09-28 21:17:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将我的模拟与多处理.pool,但我无法在池.map这会导致pickle错误,我需要在的目标函数中使用该参数池.map并行化我的代码。在函数sample()中,第四个参数“sim”的类型为“Module”,因此我不能用p.map()传递它,因为它不能被迭代,但我需要parallel()函数中的该参数,它应该用作

       model=sim.simulate(modelname, packname, config)

但目前我静态地导入该模块并将parallel()函数作为

^{pr2}$

目前我的代码是这样的,有没有办法将函数sample()中的参数'sim'声明为global并在目标函数parallel()中访问它吗。在

       def sample(file,model,config,sim,resultDir,deleteDir):
           from multiprocessing import Pool
           p=Pool()
           p.map(parallel,zip(file,model,dirs,resultpath,config))

       def parallel(modellists):
         packname=[]
         packname.append(modellists[0])     
         modelname=modellists[1]
         dirname=modellists[2]
         path=modellists[3]
         config=modellists[4]
         os.chdir(dirname)   
         model=OpenModelica.Model(modelname, packname, config)

Tags: sample函数代码configmap目标参数model
1条回答
网友
1楼 · 发布于 2024-09-28 21:17:10

这是因为pickle无法序列化模块,因此multiprocessing无法通过map传递该模块。但是,如果使用名为multiprocessingpathos.multiprocessing的分叉,它可以工作。这是因为pathos使用了dill序列化程序,它可以对模块进行pickle。在

>>> import dill 
>>> import numpy
>>> 
>>> from pathos.multiprocessing import ProcessingPool as Pool
>>> p = Pool()
>>> 
>>> def getname(x):
...   return getattr(x, '__package__', None)
... 
>>> p.map(getname, [dill, numpy])
['dill', 'numpy']

它也适用于多个参数,因此它比压缩所有参数更自然一些,并且还具有异步和迭代映射。在

^{pr2}$

获取pathos此处:https://github.com/uqfoundation

相关问题 更多 >