【发布时间】:2015-08-03 04:05:20
【问题描述】:
我有一个列表理解:
thingie=[f(a,x,c) for x in some_list]
我将其并行化如下:
from multiprocessing import Pool
pool=Pool(processes=4)
thingie=pool.map(lambda x: f(a,x,c), some_list)
但我收到以下错误:
_pickle.PicklingError: Can't pickle <function <lambda> at 0x7f60b3b0e9d8>:
attribute lookup <lambda> on __main__ failed
我尝试安装 pathos 包,它显然解决了这个问题,但是当我尝试导入它时,我得到了错误:
ImportError: No module named 'pathos'
【问题讨论】:
-
你为什么不直接使用 thingie=pool.map(f, some_list) ?检查是否可行,我可能有一个想法。
-
嗯,a 和 c 是单独定义的,需要传递给函数,所以我最终会出错。
-
我的想法是 lambda 是不可提取的,因为您无法获得源代码,因此无法将其发送到另一个进程中执行。尝试创建包装函数,例如 def wrap_f(x): return f(a, x, c) 并将其传递给 pool.map
-
成功了!谢谢!
-
我是
pathos作者。pathos几乎兼容 python 3.x……但还没有。所以这就是它对你不起作用的原因——它无法安装。pathos可以序列化lambda的原因是它使用dill序列化程序,它知道如何序列化lambda。dill通过序列化lambda的代码来序列化lambda(基本上)。
标签: python-3.4 python-multiprocessing pathos