2

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

你会劝阻我吗?我应该期待什么障碍?

我注意到了这些限制:

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

我将在 Python 中实现消息传递。但障碍普遍存在。

4

2 回答 2

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

至于你的限制,

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

我发现perlipc是各种选项之间的一个很好的讨论,尽管它有 perl 特定的代码。

于 2009-05-29T17:53:36.173 回答
3

发送方和接收方的阻塞都可以通过非阻塞 I/O 解决。

FIFO 的进一步限制:

  • 一次只有一个客户。
  • 客户端关闭 FIFO 后,服务器需要重新打开其端点。
  • 单向。

我会改用UNIX 域套接字,它没有上述限制。

作为一个额外的好处,如果你想扩展它以在多台机器之间进行通信,它几乎没有任何变化。例如,只需将 Python 文档页面上的socket替换socket.AF_INETsocket.AF_UNIX, (HOST, PORT)with filename,就可以了

SOCK_STREAM会给你类似流的行为;也就是说,两个发送可以合并为一个接收,反之亦然。 AF_UNIX还支持SOCK_DGRAM:保证数据报作为一个单元发送和读取,或者根本不读取。(类似地,AF_INET+ SOCK_STREAM=TCP,AF_INET+ SOCK_DGRAM=UDP。)

于 2009-05-29T18:11:45.280 回答