2013-10-21 133 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