因为经常要用到并行程序,我写了一个 decorator
from functools import wraps
from pathos.multiprocessing import ProcessingPool as Pool # to tackle pickle problem, using pathos.multiprocessing rather than multiprocessing
def parallel(func):
@wraps(func)
def apply(values):
pool = Pool()
result = pool.map(func, values)
pool.close()
pool.join()
return result
return apply
程序中我这样使用
@parallel
def square(x):
return x ** 2
@parallel
def cubic(x):
return x ** 3
if __name__ == '__main__':
x = range(10)
ret1 = square(x)
ret2 = cubic(ret1)
print(ret2)
会出现
result = pool.map(func, values)
File "/home/phil/anaconda2/lib/python2.7/site-packages/pathos/multiprocessing.py", line 133, in map
return _pool.map(star(f), zip(*args)) # chunksize
File "/home/phil/anaconda2/lib/python2.7/site-packages/multiprocess/pool.py", line 250, in map
assert self._state == RUN
AssertionError
问题是, 如果注释掉 square 或者 cubic 任意一个的装饰器, 程序是可以运行的。
请教该如何做?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.