上下文
我一直在查看多处理队列Python 2.7
的源代码SEE HERE,并且有一些问题。
deque用于缓冲区,Queue上的任何项目都附加到deque上,但对于get(),则使用管道。
我们可以看到在放置期间,如果馈线线程尚未启动,它将启动。
线程将弹出线程中的对象并将其发送到上述管道的读取端。
问题
那么,为什么要使用双端队列和管道呢?
难道不能只使用双端队列(或任何其他具有FIFO行为的数据结构)并同步推送和弹出?
同样也不能只使用一个Pipe,包裹send和recv?
也许这里有一些我缺少的东西,但是喂食线程弹出物品并将它们放在管道上似乎有点矫枉过正。
答案 0 :(得分:2)
multiprocessing.Queue
是能够在多个进程上运行的标准Queue
的端口。因此,它试图重现相同的行为。
deque
是一个快速插入/提取两侧的列表,理论上是无限大小。它非常适合表示堆栈或队列。但它并不适用于不同的流程。
Pipe
更像套接字,允许跨进程传输数据。管道是操作系统对象,它们的实现因操作系统而异。此外,管道的尺寸有限。如果你填充了一根烟斗,你对send
的下一次调用将会阻止,直到它的另一侧没有被耗尽。
如果您希望以与标准方式类似的方式公开能够跨多个流程工作的Queue
,则需要以下功能。
put
和get
方法能够在何时阻止程序流程时将控件留给用户。使用deque
Thread
和Pipe
是提供这些功能的最简单方法之一,但它不是唯一的。
我个人更喜欢使用裸管来让进程通信,因为它让我可以更好地控制我的应用程序。
答案 1 :(得分:0)
出列只能在一个进程内存中,因此使用它来在进程之间传递数据是不可能的(... *)
你可以只用一个Pipe
,但是你需要用锁来保护它,我想这就是为什么会出现一个出队。