0

私の Python プログラムは、いくつかの異なるファイル記述子からの読み取りを多重化する必要があります。それらのいくつかは、サブプロセスの stdout/stderr 記述子です。inotifyその他は、呼び出しに関連付けられたファイル記述子です。

私の問題は、select(). ドキュメントによると、書き込みの準備ができていると報告するソケットは、select()「PIPE_BUF バイトまでの書き込みでブロックされないことが保証されています」。

カーネルパイプバッファーに準備ができているのを待っているデータがあることを報告しても、そこに数バイトしかない可能性があるため、select()先に進んで に進むことができるわけではないため、読み取りではそのような保証は意味がないと思います。.read(socket.PIPE_BUF)

これはread()、ソケットで呼び出しているときに、一部のサブプロセスがほとんど出力を生成しないため、事実上デッドロックが発生する可能性があることを意味します。

これを回避する方法はありますか?私の現在の回避策は、それを呼び出すreadline()ことです。幸運なことに、読み取っているすべてのものが行ごとの出力を持っています。select()ブロックせずに安全に読み取ることができるバイト数を知る方法がないため、このようなパイプから読み取るときにまったく役に立ちますか?

[1] これが O_NONBLOCK ソケットとは異なることは承知しています

4

2 に答える 2

3

各パイプとソケットを先に進めても問題ありreadません。現在利用可能なデータはすべて取得されます。

>>> import os
>>> desc = os.pipe()
>>> desc
(3, 4)
>>> os.write(desc[1], 'foo')
3
>>> os.read(desc[0], 100)
'foo'
>>> os.read(desc[0], 100)

[利用可能な入力がないため、ここでハングします。^C で中断します]

...
KeyboardInterrupt
>>> os.write(desc[1], 'a')
1
>>> os.read(desc[0], 100)
'a'
>>> 
于 2013-03-23T10:12:00.803 に答える