使用self.methods进行多处理

时间:2016-11-22 16:05:49

标签: python pickle python-multiprocessing

在方法上使用multiprocessing,我们会收到错误说明self.methods cannot be pickled

为了克服这个问题,我使用了:

def _pickle_method(m):
    if m.im_self is None:
        return getattr, (m.im_class, m.im_func.func_name)
    else:
        return getattr, (m.im_self, m.im_func.func_name)


copy_reg.pickle(types.MethodType, _pickle_method)

现在我搜索了这个,但很少有问题仍然不清楚:

  1. 为什么self.methods不能被腌制?
  2. copy_reg.pickle()如何运作?它如何实现self.methods的酸洗?
  3. 使用这种方法是否存在任何负面影响,还是有其他更好的方法?
  4. 更多信息:

    我在类中有一个函数,用于执行request.getrequest.post。为了改善时间,我使用了多处理。 这是我面临的确切问题。

    SO Question

1 个答案:

答案 0 :(得分:2)

您的预期用途仍然有点模糊 - 所以我会在您的问题的新“更多信息”部分中显示解决linked question的方法,该部分不需要腌制字节码一种类方法。我认为它是如何做的很明显......

someclass.py

import multiprocessing

def call_method(x):
    return SomeClass().f(x)

class SomeClass(object):
    def __init__(self):
        pass

    def f(self, x):
        return x*x

    def go(self):
        pool = multiprocessing.Pool(processes=4)
        print pool.map(call_method,  range(10))

test.py

import someclass

if __name__== '__main__' :
    sc = someclass.SomeClass()
    sc.go()

输出:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]