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

时间:2016-01-06 20:06:40

标签: python python-2.7 queue multiprocessing

上下文

我一直在查看多处理队列Python 2.7的源代码SEE HERE,并且有一些问题。

  • deque用于缓冲区,Queue上的任何项目都附加到deque上,但对于get(),则使用管道。

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

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

问题

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

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

  • 同样也不能只使用一个Pipe,包裹send和recv?

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

2 个答案:

答案 0 :(得分:2)

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

deque是一个快速插入/提取两侧的列表,理论上是无限大小。它非常适合表示堆栈或队列。但它并不适用于不同的流程。

Pipe更像套接字,允许跨进程传输数据。管道是操作系统对象,它们的实现因操作系统而异。此外,管道的尺寸有限。如果你填充了一根烟斗,你对send的下一次调用将会阻止,直到它的另一侧没有被耗尽。

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

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

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

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

答案 1 :(得分:0)

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

你可以只用一个Pipe,但是你需要用锁来保护它,我想这就是为什么会出现一个出队。