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

Posted

技术标签:

【中文标题】循环中的多处理,“池未运行”错误【英文标题】:Multiprocessing in a loop, "Pool not running" error 【发布时间】:2020-05-27 23:59:33 【问题描述】:

我正在尝试循环运行一些计算,每个计算都会创建、使用和关闭一个池。但是计算只运行一次,然后抛出一个错误:“Pool not running”。旧的当然没有运行,但是不应该创建新的吗?

下面是一个简化的例子,类似于我的代码。更奇怪的是,在我的实际代码计算中,在崩溃之前运行了 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)

【问题讨论】:

this 是您要找的吗? 不完全是。在此示例中,当我使用不同的池(通常具有不同数量的进程)时,他们希望在一个池中进行所有计算。关闭“parallel_function”内的池对我来说很重要,因为它将单独使用 【参考方案1】:

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

这是相关的issue ticket。

我建议您使用另一个 Pool of Workers 实现。

【讨论】:

哇,没想到会是这样!您对改用什么有什么建议吗? 只要你没有特殊需求,内置的multiprocessing.Poolconcurrent.futures.ProcessPoolExecutor就可以了。如果这些不能满足您的需求,您可以查看pebblebilliard【参考方案2】:

以下假设 pathos 的行为与多处理相同。如果您使用多处理,以下将是问题。

问题是您的函数在 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)

【讨论】:

以上是关于循环中的多处理,“池未运行”错误的主要内容,如果未能解决你的问题,请参考以下文章

WPF中的多进程(Threading)处理实例

使用 Python 2.7 引发属性错误的多处理

python中的多处理[破池进程]

是否有一种特定的方法来处理循环python中的错误

循环“批量导出”崩溃 - 处理器或代码错误?

Qt学习笔记8.Qt中的多线程