Python多进程管道轮询错误

4
使用多进程库中的管道进行进程间通信时,我注意到poll函数的一些奇怪行为。如果我关闭管道的另一端,poll()函数将返回true,这有点奇怪。Python文档并没有真正说明应该期望什么。尽管如此,我认为如果管道中绝对没有数据并且另一端已经关闭,poll()至少应该返回false。我使用的是Python3.3.2,但它似乎适用于Python 2.7.5。这是故意的还是一个bug?如果不是一个bug,那它有什么作用?
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()
1个回答

2
我认为这不是一个 bug。我同意,文档在这方面并不清楚,但有几个原因说明这种行为应该是可以预期的,而相反的情况会带来更多的伤害:
  • 在不同的上下文中使用相同名称的其他函数(例如系统调用 poll 在套接字/文件描述符上)也会执行相同的操作;关闭另一端是管道上的事件,因此 poll 应该指示这一侧也有事情要做
  • 从该方法返回 True 可以理解为表示后续的 recv 不会阻塞 - 正如这里的情况一样
  • 使用非零超时或 None 调用 poll 将意味着即使没有等待的内容,当另一侧关闭时也会阻塞。

还要注意,如果 poll 返回 False,则没有好的方法来检测另一端是否关闭。


我猜你是对的。如果在连接丢失时poll()返回false,那么连接丢失将永远无法被检测到。 - John Smith
1
这是完全错误的。在关闭的管道上调用 poll() 将引发异常,或者如果从另一侧关闭,则会生成错误。这是唯一正确的处理方式。 - Overdrivr
1
recv 后,即使过时了也要读取 EOFError 异常。 - user430051

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接