我正在将我的模拟与Multiprocessing.pool并行化,但是我无法在pool.map中传递一个类型'module',这会给出pickle错误,我需要在pool.map的target函数中使用该参数来并行化我的代码。在函数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)
答案 0 :(得分:2)
这是因为pickle
无法序列化模块,因此multiprocessing
无法通过map
传递模块。但是,如果您使用名为multiprocessing
的{{1}}分叉,则可以使用。这是因为pathos.multiprocessing
使用了pathos
序列化程序,它可以腌制模块。
dill
它也适用于多个参数,因此它比自己压缩所有参数更自然 - 并且还具有异步和迭代映射。
>>> 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]
:https://github.com/uqfoundation