python multiprocessing pool 遇到问题

2016-01-19 15:32:40 +08:00
 billgreen1

因为经常要用到并行程序,我写了一个 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 任意一个的装饰器, 程序是可以运行的。

请教该如何做?

4470 次点击
所在节点    Python
1 条回复
billgreen1
2016-01-19 15:52:15 +08:00
注释掉
pool.close()
pool.join()
可行。

但是大多数程序给出的代码都有这两句的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/251850

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX