【发布时间】:2010-10-29 23:01:36
【问题描述】:
我计划使用 Unix 命名管道 (mkfifo) 进行简单的多进程消息传递。 一条消息只是一行文本。
你会阻止我这样做吗?我应该期待什么障碍?
我注意到了这些限制:
- 在收到邮件之前,发件人无法继续。
- 接收器被阻塞,直到有一些数据。需要非阻塞 IO 当我们需要停止阅读时。例如,另一个线程可能会要求这样做。
- 接收方可以在一次读取中获得许多消息。这些必须处理 在退出之前。
- 原子消息的最大长度限制为 4096 字节。这是 Linux 上的 PIPE_BUF 限制(参见 man 7 pipe)。
我将在 Python 中实现消息传递。但总体而言,障碍仍然存在。
【问题讨论】:
-
您希望有多少进程同时使用管道?如果您有多个读者,则只有其中一个读者 AFAIR 可以看到书面信息。 (这不是 100% 确定的)
-
@rodion -- 是的,它旨在仅在一个阅读器中看到一条消息。 FIFO 就是这样工作的。
-
为什么会出现阻塞问题?我可以看到一个非阻塞写入。当你在等待工作时,我看不到非阻塞读取的意义。
-
在很多情况下,您都需要非阻塞读取(您可以使用 select)。例如,多个编写器不同的管道,所以你不想只阻塞一个。另一种情况是,如果您的工作不是“基于请求”的,例如您通过管道获得更新,并希望在等待更新的同时继续工作。第三种是您可以一次处理多组消息,因此您希望获得所有可用的消息。
-
我将通过“扇入”(多输入 FIFO),这是有道理的。在这种特定情况下,不基于请求是没有意义的。批次没有意义;管道的缓冲就是您所需要的所有“批处理”。
标签: python linux unix pipe named-pipes