Python 如何将multiprocessing.Pool用于可以';不要腌
我想将函数用于多处理目的,但它不能被pickle。下面是代码的基本外观:Python 如何将multiprocessing.Pool用于可以';不要腌,python,multiprocessing,pickle,Python,Multiprocessing,Pickle,我想将函数用于多处理目的,但它不能被pickle。下面是代码的基本外观: from multiprocessing import Pool def g(x): def g1(y): return x*y return g1 if __name__ == "__main__": f=g(5) Pool(2).map(f,[2,3]) 但是当我运行代码时,我得到了错误: File "<stdin>", line 1, in <module>
from multiprocessing import Pool
def g(x):
def g1(y):
return x*y
return g1
if __name__ == "__main__":
f=g(5)
Pool(2).map(f,[2,3])
但是当我运行代码时,我得到了错误:
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
raise self._value
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup
__builtin__.function failed
文件“”,第1行,在
文件“/usr/lib/python2.7/multiprocessing/pool.py”,第251行,在地图中
返回self.map\u async(func,iterable,chunksize).get()
get中的文件“/usr/lib/python2.7/multiprocessing/pool.py”,第558行
提升自我价值
cPickle.PicklingError:无法pickle:属性查找
__内置函数失败
我已经读到
copy\u reg
可以解决这个问题,但是这些例子让我感到困惑。此外,其中一些还使用了额外的包,如marshall
。如果可能,是否有人可以仅使用copy\u reg
提供一个简单的修复 您不能将copy_reg用于此目的。copy_reg.pickle()接受一个类型和一个函数作为参数,然后使用该函数pickle该类型的对象。换句话说,它可以用来定义函数,用于pickle从给定类创建的对象。以下是文档中的示例:
>>> import copy_reg, copy, pickle
>>> class C(object):
... def __init__(self, a):
... self.a = a
...
>>> def pickle_c(c):
... print("pickling a C instance...")
... return C, (c.a,)
...
>>> copy_reg.pickle(C, pickle_c)
>>> c = C(1)
>>> d = copy.copy(c)
pickling a C instance...
>>> p = pickle.dumps(c)
pickling a C instance...
然而,不要害怕。您试图解决的问题已经有了解决方案。有一个名为Paths的库,其中包含一个名为ProcessingPool的类,该类的功能完全符合您的需要。您只需在命令行中键入以下内容:
pip install -U pathos
现在可以使用pathos而不是mulitprocessing.Pool
from pathos.multiprocessing import ProcessingPool
def g(x):
return lambda y: print(x*y)
if __name__ == '__main__':
f = g(5)
ProcessingPool(2).map(f, [2, 3])
冷静,悲伤。谢谢