gpt4 book ai didi

python - 为什么Python的多处理Queue有一个buffer和一个Pipe

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:20 25 4
gpt4 key购买 nike

上下文

一直在看源码SEE HERE对于 multiprocessing Queue Python 2.7 有一些问题。

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

  • 我们可以看到在put的时候,如果feeder thread还没有启动,它就会启动。

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

问题

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

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

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

也许这里有一些我遗漏的东西,但是进料器线程弹出项目并将它们放在管道上似乎有点过分了。

最佳答案

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

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

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

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

  • 能够按到达顺序存储尚未使用的消息的缓冲区。
  • 能够跨不同进程传输此类消息的 channel 。
  • 原子 putget 方法能够让用户控制何时阻止程序流。

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

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

关于python - 为什么Python的多处理Queue有一个buffer和一个Pipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34641807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com