我想使用一个函数来进行多处理,但它不能被 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>
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
我读到 copy_reg
可以解决这个问题,但这些例子让我感到困惑。此外,其中一些还使用额外的包,例如 marshal
。如果可能的话,有人可以提供一个简单的修复程序,仅使用 copy_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...
但是不要害怕。您试图解决的问题已经有了解决方案。有一个名为pathos 的库,其中包含一个名为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])
关于python - 如何使用 multiprocessing.Pool 处理无法 pickle 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46226438/