【问题标题】:Solutions to Pythons Multiprocessing Queue buffer dead lock? How to "get" from multiprocessing Queue when its full and continue multiprocessing?Pythons多处理队列缓冲区死锁的解决方案?当多处理队列已满并继续多处理时,如何从多处理队列中“获取”?
【发布时间】:2021-07-12 07:03:10
【问题描述】:

这个问题是关于我的计算机操作系统管道呈现的 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 将内容存储在缓存内存中?如何在多处理队列满时“获取”多处理队列并继续多处理?

【问题讨论】:

    标签: queue python-multiprocessing deadlock semaphore


    【解决方案1】:

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

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

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

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

    使用托管队列可以使您的 IPC 更加健壮,除非您能找到一种方法来忍受普通 multiprocessing 队列的不可靠性,否则最好权衡一下性能。

    【讨论】:

    • 谢谢!生病检查多处理中的经理队列!
    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2016-04-18
    • 2012-01-23
    相关资源
    最近更新 更多