2010-07-21 28 views
2

我有2個線程,線程A和線程B.如何在Python中使用管道文件描述符時檢查EOF?

線程A從sys.stdin或管道的讀取結束(使用os.pipe())獲取數據。無論讀取什麼數據(從sys.stdin或管道的讀取端),都會通過TCP套接字發送出去。線程A使用select.select()來確定它是應該從sys.stdin還是從管道的讀取端讀取,並且select.select()使用1秒超時來定期檢查並確保套接字連接是還在那兒。

線程B持有管道的寫入結束,並且通常只會將1個真正長的字符串寫入管道,然後關閉寫入結束。

線程A如何檢查管道上的EOF?基本上,我希望線程A在不再使用時關閉管道。但是,我不能冒險阻塞從管道讀取(),因爲然後sys.stdin上可用的數據將被不必要地阻止。

任何幫助將不勝感激。謝謝!

回答

7

檢查管道上EOF的唯一方法是從中讀取EOF。事實上,當你關閉管道的寫端時,即使沒有實際的數據要被讀取,select.select()也會說套接字已準備好讀取。從讀端讀取時,空字符串('')將指示EOF。即使管道處於阻塞模式,這也不會阻止您的讀取。

也就是說,完全不使用阻塞讀取可能是一個好主意。您可以使用fcntl.fcntl()來設置非阻塞的管道。你可以避免使用兩個線程直接從線程B發送到套接字,放棄看似無用的網關線程。如果您需要管理多個套接字,或者甚至需要多個生產者線程,則Twisted是管理套接字和其他通信的好方法。

+0

謝謝,這非常有用。線程B比我提到的要多,不能刪除;我只是試圖簡化我的程序,以便我只提供足夠的信息讓某人回答我的問題。再次感謝! – pcd6623 2010-07-21 20:49:30

相關問題