【问题标题】:Python multiprocessing Pool 'raise ValueError("Pool not running") ValueError: Pool not running' function with return valuePython multiprocessing Pool 'raise ValueError("Pool not running") ValueError: Pool not running' 函数返回值
【发布时间】:2019-12-08 05:53:34
【问题描述】:

我正在尝试并行运行具有循环返回值的函数。 但在 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循环中,但程序中途崩溃了,没有异常。

我发现一些解决方案使用全局列表()。但是有没有办法用返回值来维护函数呢?

Python 3.7.3

【问题讨论】:

  • 如果将pool.close() 移到print(total) 之后会发生什么?
  • 同样的异常。 ValueError: Pool not running 但这次是 pool.join() 而不是 'results = pool.map(algorithm_file.foo, population)' 并且它发生在第一次迭代中

标签: python multiprocessing return python-3.7


【解决方案1】:

我认为问题在于一旦关闭池,就无法再次使用它。这就是为什么第一次迭代运行良好,但在第二次迭代中你得到“池未运行”。

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

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))

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 2021-09-05
    • 2014-05-12
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多