Python多处理队列内存管理

时间:2018-09-12 02:14:28

标签: python queue multiprocessing

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

假设队列q是在Main流程中创建的,那么数据流是这样的吗?

A => Main => B

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

1 个答案:

答案 0 :(得分:5)

  

假设队列q是在Main进程中创建的,数据流是否像这样?

A => Main => B

不。如the docs中所述,Queue只是围绕Pipe的自动同步包装器。当您将Queue传递给孩子时,您只是在传递那个Pipe和一些锁。

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

忽略锁,进程A基本上只是写到管道,而进程B只是从它读取。

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

除非主进程在队列上调用方法,否则它与该队列完全无关。