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

2024-05-29 02:23:56 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

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

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

  • 我们可以看到,在put过程中,如果进料器线程还没有启动,它就会启动。

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

问题

  • 那么,为什么要用烟斗和烟斗呢?

  • 难道不能使用一个deque(或任何其他具有FIFO行为的数据结构)来同步push和pop吗?

  • 同样的,我们不能用一个管道,包装发送和接收吗?

也许这里有些东西我遗漏了,但给料机的螺纹弹出的项目,并把他们放在管道上似乎有点过火。在


Tags: 对象gethere管道源代码队列put过程
2条回答

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

您可以只使用一个Pipe,但之后需要用锁来保护它,我想这就是为什么引入了出列。在

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

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

Pipe更像一个套接字,允许跨进程传输数据。管道是操作系统对象,它们的实现因操作系统而异。此外,管道的尺寸有限。如果您填充了一个管道,您对send的下一次调用将阻塞,直到它的另一端没有被排空。在

如果您想公开一个Queue,它能够以与标准流程相似的方式跨多个进程工作,那么您需要以下特性。在

  • 一种缓冲区,能够按到达顺序存储尚未消耗的报文。在
  • 一种能够在不同进程间传送这种信息的通道。在
  • 原子putget方法可以让用户决定何时阻止程序流。在

使用dequeaThreadPipe是提供这些特性的最简单方法之一,但它不是唯一的方法。在

我个人更喜欢使用裸管道让进程进行通信,因为这样可以让我对应用程序有更多的控制。在

相关问题 更多 >

    热门问题