不能在multiprocessing.pool中腌制类型'模块'

时间:2015-01-13 09:16:45

标签: python parallel-processing multiprocessing

我正在将我的模拟与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)

1 个答案:

答案 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