Python 多处理队列缓冲区死锁的解决方案?如何在多处理队列已满时从多处理队列中“获取”并继续进行多处理?

时间:2021-07-12 07:03:10

标签: queue python-multiprocessing deadlock semaphore

这个问题是关于使用 Python 进行多处理和由我的计算机操作系统管道呈现的 Python 多处理队列缓冲区限制。基本上,我遇到了 Python 多处理队列缓冲区的限制。

这是我到目前为止的简单实现

import os
from multiprocessing import Queue,Lock,Manager
def threaded_results(q,*args):
    """do something"""
    q.put(*args)

def main():
    manager = Manager()
    return_dict = manager.dict()

    cpu = os.cpu_count()
    q = Queue()
    processes = []
    for i in range(cpu):
        p = Process(target=threaded_results,args=(q,*args))
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

    results = [q.get() for proc in processes]

我读到我必须先清空队列,然后再添加回由某种称为信号量的东西编排的队列。我正在考虑使用我自己定义的数据结构或重构我的代码设计。问题是,是否有任何传统的解决方案可以绕过操作系统级别的队列缓冲区限制,以便使用 Python 将内容存储在缓存中?如何在已满时“获取”多处理队列并继续进行多处理?

1 个答案:

答案 0 :(得分:1)

使用多处理库一段时间后,我发现实现强大的多处理队列的最简单方法是使用 multiprocessing.Manager 对象。来自文档:

<块引用>

创建一个共享的 queue.Queue 对象并为其返回一个代理。

不是分配一个单独的线程来通过管道刷新数据,Manager 对象创建和管理一个标准的多线程队列,它不必通过 Pipe(避风港)刷新数据我看过源代码,所以我不能肯定)。这意味着您的代码几乎可以无限期地继续运行。

这些都不是免费的,我发现在一个简单的测试中,托管队列的运行速度比 multiprocessing 队列慢很多(几乎 20 倍),尽管区别在于'由于其他瓶颈,当队列集成到一个完整的系统中时几乎同样明显。

使用托管队列可以使您的 IPC 更加强大,并且除非您能找到一种方法来应对普通 multiprocessing 队列的不可靠性,否则最好权衡性能。

>
相关问题