Python多处理队列内存管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多处理队列内存管理相关的知识,希望对你有一定的参考价值。

说我有Main进程和2个额外的进程AB。在这个程序中,A应该向B发送数据。如果我们有这样的代码:

from multiprocessing import Process, Queue

def process_a(iterable, q):

    for x in iterable:
        q.put(x)

def process_b(q):

    while some_condition():
        x = q.get()


iterable = some_iterable()
q = Queue()

pa = Process(target=process_a, args=(iterable, q))
pb = Process(target=process_b, args=(q,))

pa.start()
pb.start()

pa.join()
pb.join()

鉴于Queue q是在Main进程中创建的,数据是否像这样流动?

A => Main => B

如果是这样,有没有办法在Queue上初始化B并传递给A,以便数据直接从A跳到B跳过Main

答案

鉴于队列q是在主进程中创建的,数据是否像这样流动?

A => Main => B

没有。正如the docs所解释的那样,Queue只是围绕Pipe的自动同步包装器。当你把Queue传给一个孩子时,你只是传递了Pipe和一些锁。

Pipe只是一个操作系统管道的包装器。当你将Pipe传递给一个孩子时,你只需传递管道的文件描述符/句柄。

忽略锁定,进程A基本上只是写入管道,进程B只是从中读取。

锁确实使事情变得更复杂(也可能意味着进程A旋转隐藏的后台线程),但它们仍然不涉及主进程。

除非主进程调用队列上的方法,否则它根本与该队列无关。

以上是关于Python多处理队列内存管理的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中填充队列和管理多处理

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

为啥 Python 多处理队列会弄乱字典?

泡菜转储的多处理队列问题

Python 多进程内存占用问题

等待队列填充python多处理的最佳方法