python - 如何使用 multiprocessing.Pool 处理无法 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>
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/

相关文章:

python - “An expression that has one of two values, depending on a condition.” 是条件表达式的准确定义吗?

python - Django、Virtualenv、nginx + uwsgi导入模块wsgi报错

python - 继承烦恼。 - Python

Python多处理连续处理与await

python - 如何在 Python 中实现守护进程?

java - Scala/Java 中的简单、无忧、零样板序列化,类似于 Python 的 Pickle?

python - CPython 和 IronPython cPickle 之间的兼容性

python - 如何打印传递给 python 脚本的所有参数?

python - 使用多处理交错加载数据。队列有时会导致项目被无序消耗

python - pickle.load() 在 Windows 中引发 EOFError