python多处理管道轮询bug

时间:2013-10-21 06:47:16

标签: python multiprocessing pipe

使用管道与多处理库进行进程通信我发现了poll函数的一些奇怪的行为。如果我关闭管道的另一端poll()返回true,这有点奇怪。 python docs并不真正告诉我们期待什么。我仍然认为如果管道中没有任何东西,而另一端甚至关闭,poll()至少会返回false。我使用python3.3.2,但对于python 2.7.5似乎是一样的。这是故意还是错误,如果它不是一个错误,它有什么用呢?

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 个答案:

答案 0 :(得分:0)

我不认为这是一个错误。我同意,文件在这方面并不清楚,但有几个原因可以预期这种行为,反之则会造成更多弊大于利:

  • 在不同的上下文中具有相同名称的其他函数,如套接字/文件描述符上的系统调用poll,也是如此;关闭另一端是管道上的一个事件,所以poll应该表明在这方面还有一些事情要做。
  • 从方法中返回True可以理解为后续recv不会阻止 - 确切地说就是这里
  • 使用非零超时或使用poll调用None将意味着阻止,即使没有任何等待,当另一方已关闭时。

另请注意,如果poll返回False,则无法检测到另一端已关闭。