4

使用管道与多处理库进行进程通信我注意到 poll 函数的一些奇怪行为。如果我关闭管道 poll() 的另一端,则返回 true,这有点奇怪。python 文档并没有真正说明会发生什么。我仍然在想 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()
4

1 回答 1

2

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

  • 在不同上下文中的其他同名函数,例如poll套接字/文件描述符上的系统调用,执行相同的操作;关闭另一端是管道上的一个事件,因此poll应该表明这一端也有一些事情要做
  • 从方法返回True可以理解为说后续recv不会阻塞——这里就是这样
  • poll以非零超时或 with调用None将意味着即使在没有什么可等待的情况下,当对方已经关闭时也会阻塞。

另请注意,如果poll返回,则没有检测另一端关闭的好方法False

于 2013-10-21T11:30:18.777 回答