当我运行类似的东西时:
from multiprocessing import Pool p = Pool(5) def f(x): return x*x p.map(f, [1,2,3])
它工作正常。但是,将其作为类的函数:
class calculate(object): def run(self): def f(x): return x*x p = Pool() return p.map(f, [1,2,3]) cl = calculate() print cl.run()
给我以下错误:
Exception in thread Thread-1: Traceback (most recent call last): File "/sw/lib/python2.6/threading.py", line 532, in __bootstrap_inner self.run() File "/sw/lib/python2.6/threading.py", line 484, in run self.__target(*self.__args, **self.__kwargs) File "/sw/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks put(task) PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
我看过 Alex Martelli 的一篇文章处理了同样的问题,但不够明确。
我也对 pool.map 可以接受的函数类型的限制感到恼火。我写了以下内容来规避这一点。它似乎可以工作,即使是对 parmap 的递归使用。
from multiprocessing import Process, Pipe from itertools import izip def spawn(f): def fun(pipe, x): pipe.send(f(x)) pipe.close() return fun def parmap(f, X): pipe = [Pipe() for x in X] proc = [Process(target=spawn(f), args=(c, x)) for x, (p, c) in izip(X, pipe)] [p.start() for p in proc] [p.join() for p in proc] return [p.recv() for (p, c) in pipe] if __name__ == '__main__': print parmap(lambda x: x**x, range(1, 5))