循环中的多进程处理,出现“池未运行”错误

6
我试图在循环中运行一些计算,每个计算都会创建、使用和关闭一个池。但是计算只运行一次,然后就抛出一个错误:“池未运行”。当然旧的没有运行,但是新的不应该被创建吗?
下面是一个简化的示例,类似于我的代码。更奇怪的是,在我的实际代码中,计算在崩溃之前运行了7次,所以我真的很困惑问题出在哪里。任何建议都将不胜感激!
from pathos.multiprocessing import ProcessingPool as Pool

def add_two(number):  
    return (number + 2)

def parallel_function(numbers):
    pool = Pool(10)
    result = pool.imap(add_two, numbers)
    pool.close()
    pool.join()    
    return(result)

sets=[
    [1, 2, 3],
    [2, 3, 4],
    [3, 4, 5]
]

for one_set in sets:
    x = parallel_function(one_set)
    for i in x:
        print(i)

1
这是你要找的内容吗?链接 - Jamie
并不完全一样。在这个例子中,他们希望在一个池中进行所有计算,而我使用不同的池(通常具有不同数量的进程)。 对我来说,在“parallel_function”内关闭池非常重要,因为它将被单独使用。 - Anna
2个回答

4

这是一个使用单例模式实现池的 pathos 限制。

这是相关的问题票

我建议您使用另一个工作池实现。


哇,从来没有想过是这样的!你有什么建议可以用来替代吗? - Anna
只要您没有特殊需求,内置的 multiprocessing.Poolconcurrent.futures.ProcessPoolExecutor 就足够了。如果这些无法满足您的需求,您可以看看 pebblebilliard - noxdafox

1
以下假设pathos的作用与multiprocessing相同。如果您正在使用multiprocessing,则会出现以下问题。
问题在于您的函数在imap完成之前关闭了进程池:
def parallel_function(numbers):
    pool = Pool(10)
    result = pool.imap(add_two, numbers)
    pool.close()
    pool.join()    
    return(result)

这应该写成:

def parallel_function(numbers):
    with Pool(10) as pool:
       yield from pool.imap(add_two, numbers)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接