2010-01-26 62 views
4

我有通過os.mkfifo()命令創建的命名管道。我有兩個不同的Python進程訪問這個命名管道,進程A正在讀取,進程B正在寫入。進程A使用select函數來確定fifo/pipe中何時有數據可用。儘管在每次寫入調用之後進程B都會刷新,但進程A的select函數並不總是返回(它保持阻塞,就好像沒有新數據一樣)。在深入研究這個問題之後,我最終編寫了程序B,在真正的調用之前和之後添加了5KB的垃圾寫入,同樣,程序A被編程爲忽略這5KB。現在一切正常,選擇總是適當地返回。我注意到如果進程B被殺死(在它正在寫入和刷新之後,它將睡在讀取管道上),那麼進程A的選擇將返回,從而達到了這種黑客解決方案。在Python中爲命名管道刷新有問題嗎?命名管道不在Python中刷新

+0

你能否發佈一些顯示問題的最小測試代碼。正如你所描述的,有關十幾行的問題應該足夠了。 – kriss 2010-03-25 15:24:12

回答

0

刷新操作與命名管道無關;命名管道的數據嚴格保存在內存中,並且在讀取或FIFO關閉之前不會被釋放。

+3

如果輸出到管道的數據在應用程序級別進行緩衝,則刷新操作仍然可能是相關的。 – 2010-01-26 02:09:15

+0

我猜測應用程序級別有緩衝區,有人知道任何錯誤嗎? – BrainCore 2010-01-26 03:10:32

1

您使用的是什麼API? os.read()os.write()不會緩衝任何內容。

1

要了解Python的內部緩衝是否會導致您的問題,請在運行腳本時使用「python -u」而不是「python」。這將強制python進入「無緩衝模式」,這將導致所有輸出即時打印。