我正在使用 Multiprocessing.pool 并行化我的模拟,但是我无法在 pool.map 中传递类型“模块”,这会导致 pickling 错误,我需要在 pool.map 的目标函数中使用该参数来并行化我的代码。在函数sample()中,第四个参数'sim'是'Module'类型,所以我不能用p.map()传递它,因为它不能迭代,但我需要在函数parallel()中使用该参数,应该用作
model=sim.simulate(modelname, packname, config)
但目前我正在静态导入该模块并在函数parallel()中调用
model=OpenModelica.simulate(modelname, packname, config)
目前我的代码如下所示,有没有办法将函数sample()中的参数“sim”声明为全局参数并在目标函数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)
最佳答案
这是因为 pickle
无法序列化模块,因此 multiprocessing
无法通过 map
传递模块。但是,如果您使用名为 pathos.multiprocessing
的 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']
它也适用于多个参数,因此比压缩所有参数更自然 - 并且还具有异步和迭代映射。
>>> packname = list('abcde')
>>> modelname = list('ABCDE')
>>> dirname = list('12345')
>>> config = [1,2,3,4,5]
>>> import math
>>> f = [math.sin, math.cos, math.sqrt, math.log, math.tan]
>>>
>>> def parallel(s1, s2, si, i, f):
... s = (s1 + s2).lower().count('b')
... return f(int(si) + i - s)
...
>>> res = p.amap(parallel, packname, modelname, dirname, config, f)
>>> print "asynchronous!"
'asynchronous!'
>>> res.get()
[0.9092974268256817, -0.4161468365471424, 2.449489742783178, 2.0794415416798357, 0.6483608274590867]
在此处获取pathos
:https://github.com/uqfoundation
关于python - 无法在 multiprocessing.pool 中 pickle 类型 'module',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27918547/