【问题标题】:Python multiprocessing Queue memory managementPython多处理队列内存管理
【发布时间】:2018-09-12 02:14:28
【问题描述】:

假设我有 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

如果是这样,有没有办法让QueueB 上初始化并传递给A,这样数据直接从AB 跳过Main

【问题讨论】:

    标签: python queue multiprocessing


    【解决方案1】:

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

    A => Main => B
    

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-11
      • 2013-06-18
      • 2022-01-21
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 2012-01-17
      • 2017-10-21
      • 1970-01-01
      相关资源
      最近更新 更多