为什么Python的多处理队列有一个缓冲区和一个管道

Wra*_*ess 5 python queue multiprocessing python-2.7

语境

我一直在查看 多处理队列的源代码(请参见此处)Python 2.7并有一些问题。

  • 双端队列用于缓冲区,放入队列的任何项目都会附加到双端队列,但对于 get(),使用管道。

  • 我们可以看到,在 put 期间,如果 feeder 线程尚未启动,它将启动。

  • 该线程将从线程中弹出对象并将它们发送到上述管道的读取端。

问题

  • 那么,为什么要使用双端队列和管道呢?

  • 难道不能只使用双端队列(或任何其他具有 FIFO 行为的数据结构)并同步推送和弹出吗?

  • 同样,难道不能只使用 Pipe 来包装发送和接收吗?

也许我在这里遗漏了一些东西,但是馈线线程弹出物品并将它们放在管道上似乎有点矫枉过正。

nox*_*fox 5

它是能够在多个进程上运行的multiprocessing.Queue标准的一个端口。Queue因此它试图重现相同的行为。

Adeque是一个两侧都可以快速插入/提取的列表,理论上具有无限大小。它非常适合表示堆栈或队列。但它不能跨不同进程工作。

A 的Pipe工作方式更像套接字,允许跨进程传输数据。管道是操作系统对象,其实现因操作系统而异。此外,管道的尺寸是有限的。如果你填满了管道,你的下一次调用将会send阻塞,直到管道的另一边没有被排空。

如果您希望公开一种Queue能够以与标准类似的方式跨多个进程工作的功能,则需要以下功能。

  • 能够按到达顺序存储尚未被消耗的消息的缓冲区。
  • 能够跨不同进程传输此类消息的通道。
  • 原子putget方法能够将何时阻止程序流的控制权留给用户。

使用 adequeThreadaPipe是提供这些功能的最简单方法之一,但它不是唯一的方法。

我个人更喜欢使用裸管道来让进程进行通信,因为它可以让我更好地控制我的应用程序。


Yoa*_*ner 0

出队只能在一个进程内存中,因此使用它在进程之间传递数据是不可能的(...*)

你可以只使用 aPipe但你需要用锁来保护它,我想这就是引入出队的原因。