4

マルチプロセッシング ライブラリとのプロセス通信にパイプを使用すると、ポーリング関数の奇妙な動作に気付きました。パイプのもう一方の端を閉じると、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()
4

1 に答える 1

2

これはバグではないと思います。ドキュメントはこの点で明確ではありませんが、この動作が予想される理由がいくつかあり、その逆は良いことよりも害をもたらす可能性があります。

  • pollソケット/ファイル記述子のシステムコールなど、異なるコンテキストでの同じ名前の他の関数も同じことを行います。もう一方の端を閉じることはパイプ上のイベントであるためpoll、こちら側にも何かする必要があることを示す必要があります
  • メソッドから戻るTrueことは、後続がブロックされないことを言っていると理解できますrecv-まさにここに当てはまります
  • pollゼロ以外のタイムアウトまたは with で呼び出すと、None待機するものが何もない場合でも、反対側が閉じている場合でもブロックされます。

pollまた、返された場合、もう一方の端が閉じたことを検出する適切な手段がないことに注意してくださいFalse

于 2013-10-21T11:30:18.777 に答える