为什么Python的多进程队列拥有缓冲区和管道

5

背景

我在查看 这里 的源代码,该代码是用于Python 2.7中的多进程队列的。我有一些问题。

  • 使用双端队列(deque)作为缓冲区,并将放入队列中的任何项附加到双端队列中,但对于get()操作,则使用管道(pipe)。

  • 可以看到,在put()期间,如果饲送线程尚未启动,则会启动。

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

问题

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

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

  • 同样,是否也可以只使用管道,包装send()和recv()方法呢?

也许我有所遗漏,但是饲养线程将项目弹出并将它们放在管道中似乎有些过分了。

2个回答

5
multiprocessing.Queue 是标准 Queue 的一个移植版本,能够在多个进程上运行。因此,它试图复制相同的行为。 deque 是一个列表,具有理论上无限大小的快速插入/提取两侧功能。它非常适合表示堆栈或队列。但是,它不适用于跨不同进程的情况。 Pipe 更像套接字,允许在进程之间传输数据。管道是操作系统对象,它们的实现因操作系统而异。此外,管道大小受到限制。如果填满了管道,下一次调用 send 将会阻塞,直到其另一端被清空。
如果想要公开一个能够在多个进程中以类似标准方式工作的 Queue,则需要以下功能:
- 能够按到达顺序存储未消耗的消息的缓冲区。 - 能够在不同进程之间传输这些消息的通道。 - 原子 putget 方法,能够让用户控制何时阻止程序流。
使用 dequeThreadPipe 是实现这些功能的最简单方法之一,但不是唯一的方法。
我个人更喜欢使用裸管道让进程通信,因为这样可以更好地控制我的应用程序。

0
一个双端队列只能存在于一个进程的内存中,因此使用它在进程之间传递数据是不可能的(...*)。
你可以使用一个管道,但是你需要用锁来保护它,我想这就是为什么引入了双端队列的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接