Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将multiprocessing.Pool用于可以';不要腌_Python_Multiprocessing_Pickle - Fatal编程技术网

Python 如何将multiprocessing.Pool用于可以';不要腌

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>

我想将函数用于多处理目的,但它不能被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
文件“”,第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])

冷静,悲伤。谢谢