Python中的类中的池

use*_*925 9 python pool class multiprocessing

我想在课堂上使用Pool,但似乎有问题.我的代码很长,我创建了一个小型演示变体来说明问题.如果你能给我一个下面代码的变体,那就太棒了.

from multiprocessing import Pool

class SeriesInstance(object):
    def __init__(self):
        self.numbers = [1,2,3]
    def F(self, x):
        return x * x
    def run(self):
        p = Pool()
        print p.map(self.F, self.numbers)


ins = SeriesInstance()
ins.run()
Run Code Online (Sandbox Code Playgroud)

输出:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Run Code Online (Sandbox Code Playgroud)

然后挂起.

小智 9

它看起来像是因为函数传递给工作线程的方式(酸洗),不幸的是你无法使用实例方法.我的第一个想法是使用lambdas,但事实证明内置的pickler也无法序列化.遗憾的是,解决方案只是在全局命名空间中使用函数.你仍然可以使它成为一个实例属性,看看:

from multiprocessing import Pool

def F(x):
    return x * x

class SeriesInstance(object):
    def __init__(self):
        self.numbers = [1,2,3]
        self.F = F

    def run(self):
        p = Pool()
        out = p.map(self.F, self.numbers)
        p.close()
        p.join()
        return out

if __name__ == '__main__':
    print SeriesInstance().run()
Run Code Online (Sandbox Code Playgroud)