python - FIFO(命名管道)消息传递障碍

标签 python linux unix pipe named-pipes

我计划使用 Unix 命名管道 (mkfifo) 进行简单的多进程消息传递。 一条消息只是一行文本。

你会阻止我这样做吗?我应该遇到什么障碍?

我注意到这些限制:

  1. 在收到消息之前,发件人无法继续。
  2. 接收器被阻塞,直到有一些数据。需要非阻塞 IO 当我们需要停止阅读时。例如,另一个线程可能会要求这样做。
  3. 接收方可以在一次读取中获得许多消息。这些都要处理 退出前。
  4. 原子消息的最大长度限制为 4096 字节。这是 Linux 上的 PIPE_BUF 限制(参见 man 7 pipe)。

我将用 Python 实现消息传递。但总体而言,障碍依然存在。

最佳答案

  1. 缺乏可移植性——它们主要是 Unix 的东西。套接字更便携。
  2. 更难扩展到多个系统(另一个套接字+)
  3. 另一方面,对于同一台机器上的进程,我认为管道比套接字更快(通信开销更少)。

至于你的局限性,

  1. 您可以在管道上使用“select”来进行非阻塞读取。
  2. 我通常(在 perl 中)在用“\n”分隔的管道上打印我的消息,并从中读取一行以一次获取一条消息。
  3. 请注意原子长度。

我找到了 perlipc成为各种选项之间的一个很好的讨论,尽管它有 perl 特定的代码。

关于python - FIFO(命名管道)消息传递障碍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/927233/

相关文章:

python - 使用 Python 查找带有正则表达式的重叠序列

python - 在 python 中解析文本的最佳工具是什么?

python virtualenv模块导入错误

linux - filp_open 给出没有操作指针的文件指针?

validation - Unix 文件名中应限制哪些字符?

python - SymPy:将字符串解析为流形上的函数

Linux:获取程序当前打开的文件列表

linux - 提取带有各种分隔符的文本的字符串号

java - 使用 org.springframework.jdbc.datasource.init.ScriptUtils 在 unix 中执行一个 .sql 文件

c - C语言-Unix环境中的Fscanf和sprint命令