python 多处理管道轮询错误

问题描述 投票:0回答:1

使用管道与多处理库进行进程通信,我注意到 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()
python multiprocessing pipe
1个回答
2
投票

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

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

另请注意,如果

poll
返回
False
,则没有好的方法可以检测另一端是否关闭。

© www.soinside.com 2019 - 2024. All rights reserved.