python - 无法在 multiprocessing.pool 中 pickle 类型 'module'

标签 python parallel-processing multiprocessing

我正在使用 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.multiprocessingmultiprocessing 分支,它就可以工作。这是因为 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/

相关文章:

python - QTabWidget 的 PyQt 鼠标事件

python - 如何在cherrypy中使用 session ?

c# - 在 .net c# 中异步或并行地在数据库中保存记录

c++ - MS concurrency::parallel_for() 单次迭代的性能

multithreading - 编写搜索引擎

Python 多处理模块 freeze_support() line can be omitted error Windows

c - 多进程计算中如何保证结果的重复性

python - 每个数据点具有不同文本的散点图

python - pd.Series.argsort() 和 nan 值

concurrency - 关于(类似工具)LoadRunner 的概念性问题