Python多处理池'raise ValueError(“ Pool not running”)ValueError:Pool not running'函数,返回值

时间:2019-12-08 05:53:34

标签: multithreading return python-3.7

我正在尝试并行运行具有循环返回值的函数。 但是在for循环的第二次迭代中,它似乎停留在results = pool.map(algorithm_file.foo, population)上,

    raise ValueError("Pool not running")
ValueError: Pool not running

示例代码:

from multiprocessing.dummy import Pool
import algorithm_file

population = [1, 3, 4]
pool = Pool(len(population))

total = list()

for _ in range(10):
    results = pool.map(algorithm_file.foo, population)
    pool.close()
    pool.join()
    total.append(sum(results))

print(total)

algorithm_file.py内的内容

from random import randint

def foo(x):
    return x * randint(0,5)

我尝试将pool = Pool(len(population))放入for循环中,但是该程序崩溃了,中间没有出现异常。

我发现一些使用全局list()的解决方案。但是无论如何,要使用返回值维护函数吗?

Python 3.7.3

1 个答案:

答案 0 :(得分:0)

我认为问题在于,一旦关闭池,就无法再次使用它。这就是为什么第一次迭代进行得很好,但是在第二次迭代中,您会看到“ Pool not running”。

因此,修复提供的代码段的一种方法是在每次迭代时实例化一个新池:

for _ in range(10):
    pool = Pool(len(population))
    results = pool.map(algorithm_file.foo, population)
    pool.close()
    pool.join()
    total.append(sum(results))

但是,请注意,将池用作上下文管理器(即,

)更加(IMO)优雅和Pythonic
for _ in range(10):
    with Pool(len(population)) as pool:
        results = pool.map(algorithm_file.foo, population)
        total.append(sum(results))