2013-10-21 180 views
2

使用管道進行與多處理庫的進程通信我注意到poll函數的一些奇怪行爲。如果我關閉管道的另一端poll()返回true,這有點奇怪。 python文檔並不真正告訴你期望什麼。我仍然認爲poll()至少會返回false,如果管道中沒有任何內容,並且另一端甚至關閉。我使用python3.3.2,但它似乎是相同的python 2.7.5。這是打算或一個錯誤,如果它不是一個錯誤什麼是好的?python多處理管道poll問題

import multiprocessing 

if __name__ == '__main__': 

    con = multiprocessing.Pipe(True) 
    con1, con2 = con 

    print(str(con1.poll())) #prints False 
    con2.close() 
    con1.close() 

    con = multiprocessing.Pipe(True) 
    con1, con2 = con 

    con2.close() 
    print(str(con1.poll())) #prints True 
    con1.close() 

回答

0

我不認爲這是一個錯誤。我同意,文件是不是清楚在這方面,但也有幾個原因,這種行爲應該在意料之中,而相反會導致弊大於利:在不同環境下的同名

  • 等功能,就像套接字/文件描述符上的系統調用poll一樣,關閉另一端的事件時,管,所以poll應說明有東西這一邊做得太
  • 從方法返回True可以理解的話說,隨後recv不會阻止 - 這裏正是如此
  • 調用poll非零超時或None將意味着阻塞,即使沒有什麼可以等待,而另一方已關閉。

另請注意,如果poll返回False,那麼將不存在檢測另一端關閉的好方法。

+0

我想你是對的。如果poll()在連接丟失時返回false,則永遠不會檢測到連接丟失。 –

+0

這是完全錯誤的。在關閉的管道上調用poll()會引發異常,或者如果從另一端關閉會產生錯誤。這是表達它的唯一干淨方式。 – Overdrivr

+0

舊的,但在'recv'後面讀取[EOFError](https://docs.python.org/3.4/library/exceptions.html#EOFError)異常。 – user430051