lai*_*ila 2 python-3.4 python-multiprocessing pathos
我有一个清单的理解:
thingie=[f(a,x,c) for x in some_list]
Run Code Online (Sandbox Code Playgroud)
我正在并行化如下:
from multiprocessing import Pool
pool=Pool(processes=4)
thingie=pool.map(lambda x: f(a,x,c), some_list)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
_pickle.PicklingError: Can't pickle <function <lambda> at 0x7f60b3b0e9d8>:
attribute lookup <lambda> on __main__ failed
Run Code Online (Sandbox Code Playgroud)
我尝试安装pathos
显然可以解决此问题的软件包,但是当我尝试导入它时,出现错误:
ImportError: No module named 'pathos'
Run Code Online (Sandbox Code Playgroud)
好的,所以这个答案仅供参考,我已经在评论对话中与问题的作者弄清楚了。
multiprocessing
需要在进程之间传输每个对象,因此它用于pickle
在一个进程中对其进行序列化,而在另一个进程中进行反序列化。一切正常,但是pickle
无法序列化lambda
。这么说是因为pickle
需要功能源来对其进行序列化,并且lambda
不会有它,但是我不确定100%,也无法引用我的源代码。
如果map()
在1个参数函数上使用将不会有任何问题-您可以传递该函数而不是lambda
。如果您有更多参数,例如您的示例,则需要使用def
关键字定义一些包装器:
from multiprocessing import Pool
def f(x, y, z):
print(x, y, z)
def f_wrapper(y):
return f(1, y, "a")
pool = Pool(processes=4)
result = pool.map(f_wrapper, [7, 9, 11])
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1599 次 |
最近记录: |