多处理:池和泡菜错误 - 酸洗错误:无法挑选<type'instancemethod'=“”>:属性查找__builtin __ .instancemethod failed </type>

时间:2012-09-12 21:29:51

标签: python multiprocessing pickle

我有两个文件:

x.py

class BF(object)
   def __init__():
   .
   .
   def add(self,z):
   .
   .

y.py

from y import BF
def FUNC((a,b,bf))
   .
   .
   bf.add(x)
   .
   .
   return bf

.
.
if __name__ == '__main__':
    pool = multiprocessing.Pool(3)
    for i in range(len(sl)):
         bf_set.append(BF())
    results = pool.map(FUNC,zip(sl, itertools.repeat(aa), bf_set))

我也尝试在FUNC中定义BF,但是我得到了:

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

我已经阅读了一些有关相关问题的帖子,但是他们在类中有pool.map(),因此解决方案无法应用于此问题(我猜)。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我将基本上使用你上面的内容,但把它变成工作代码。如果您使用dill,则序列化没有问题。我正在使用名为multiprocessing的{​​{1}}分叉,它使用pathos.multiprocessing代替dill

pickle

这很有效,因为>>> def FUNC((a,b,bf)): ... z = a+b ... bf.add(z) ... return bf ... >>> class BF(object): ... def add(self, z): ... self.z += z ... def __init__(self): ... self.z = 0 ... >>> from pathos.multiprocessing import ProcessingPool as Pool >>> pool = Pool() >>> >>> f = BF() >>> f.add(1) >>> f.z 1 >>> >>> FUNC((0,1,f)) <__main__.BF object at 0x10d387f50> >>> >>> FUNC((0,1,f)).z 2 >>> >>> sl = [BF() for i in range(10)] >>> results = pool.map(FUNC, zip(range(len(sl)), range(len(sl)), sl)) >>> [bf.z for bf in results] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 使用pathos,它可以在python中序列化几乎所有内容。

dill

获取>>> import dill as pickle >>> pickle.loads(pickle.dumps(bf.add)) <bound method BF.add of <__main__.BF object at 0x10d383950>> >>> pickle.loads(pickle.dumps(BF.add)) <unbound method BF.add> pathoshttps://github.com/uqfoundation