2009-05-29 86 views
2

我打算使用Unix命名管道(mkfifo)進行簡單的多進程消息傳遞。 消息將只是一行文本。FIFO(命名管道)消息障礙

你會讓我感到厭惡嗎?我應該期待什麼障礙?

我已經注意到了這些限制:

  1. 發送方無法繼續進行直到收到消息。
  2. 接收器被阻塞,直到有一些數據。當我們需要停止閱讀時,非阻塞IO將需要 。例如,另一個線程可以要求。
  3. 接收器可以在一次讀取中獲得許多消息。這些在退出前必須被處理 。
  4. 原子消息的最大長度受限於4096個字節。這是Linux上的PIPE_BUF限制(請參見man 7 pipe)。

我將在Python中實現消息傳遞。但是障礙總的來說是一樣的。

+0

您希望同時使用多少個進程?如果您有多個讀者,則只有其中一位讀者可以看到書面信息,AFAIR。 (在這一個不是100%肯定) – rodion 2009-05-29 17:50:53

+0

@rodion - 是的,它只是在一個閱讀器中看到一條消息。 FIFO以這種方式工作。 – 2009-05-29 18:09:30

+0

爲什麼要阻止問題?我可以看到一個非阻塞寫入。當你在等待工作時,我看不到無阻塞的閱讀。 – 2009-05-29 18:29:15

回答

5
  1. 缺乏可移植性 - 它們主要是Unix的東西。套接字更便攜。
  2. 難以擴展到多個系統(另一個插座+)
  3. 另一方面,我相信管道比同一臺機器上的進程的套接字更快(通信開銷更少)。

至於你的限制,

  1. 可以 「select」 的管道,做非阻塞讀。
  2. 我通常(在perl中)打印出由「\ n」分隔的管道上的消息,並從中讀取一行消息以獲得一條消息。
  3. 請注意原子長度。

我發現perlipc是各種選項之間的一個很好的討論,雖然它有Perl特定的代碼。

3

發送方和接收方的阻塞都可以通過非阻塞I/O來解決。

的FIFO的進一步限制:

  • 在同一時間只有一個客戶端。
  • 客戶端關閉FIFO後,服務器需要重新打開其端點。
  • 單向。

我會用UNIX domain sockets代替,它沒有上述限制。

作爲一個額外的好處,如果你想擴展它在多臺機器之間進行通信,它幾乎沒有任何改變。例如,只需參閱socket上的Python文檔頁面,並用socket.AF_UNIX,(HOST, PORT)filename替換socket.AF_INET,並且它僅適用於

SOCK_STREAM會給你流式的行爲;也就是說,兩次發送可能合併爲一次接收,反之亦然。 AF_UNIX也支持SOCK_DGRAM:數據報被保證發送和閱讀所有作爲一個單位或根本沒有。 (類似地,AF_INET + SOCK_STREAM = TCP,AF_INET + SOCK_DGRAM = UDP。)

相關問題