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

时间:2009-05-29 17:35:45

标签: python linux unix pipe named-pipes

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

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

我注意到了这些限制:

  1. 在收到邮件之前,发件人无法继续。
  2. 接收器被阻止,直到有一些数据。需要非阻塞IO 当我们需要停止阅读时。例如,另一个线程可以要求它。
  3. 接收器可以在一次读取中获得许多消息。这些都必须加工 在退出之前。
  4. 原子消息的最大长度限制为4096字节。这是Linux上的PIPE_BUF限制(参见man 7 pipe)。
  5. 我将在Python中实现消息传递。但总体上存在障碍。

2 个答案:

答案 0 :(得分:5)

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

    1. 您可以在管道上“select”进行无阻塞读取。
    2. 我通常(在perl中)在“\ n”分隔的管道上打印我的消息,并从中读取一行以一次收到一条消息。
    3. 小心原子长度。
    4. 我发现perlipc是各种选项之间的良好讨论,尽管它有perl特定代码。

答案 1 :(得分:3)

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

FIFO的进一步限制:

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

我会使用UNIX domain sockets代替,但没有上述限制。

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

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