Python多处理队列内存管理

问题描述 投票:2回答:1

说我有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

python queue multiprocessing
1个回答
5
投票

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

A => Main => B

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.