Unixシステム上でPython3プロセスを常に実行していて、時折しか実行されない他のプロセスの名前付きパイプを使ってランダムにデータを送信できるようにしたい。名前付きパイプにデータがない場合は、他の処理を続行したいので、ブロックを使わずにデータがあるかどうかを確認する必要があります。Python:名前付きパイプにデータがあるかどうかを調べる
非ブロックフラグを設定しない限り、ブロックを開くことなくブロックを開く方法を理解できません。フラグを設定すると、読み込み前または読み込み中にパイプに書き込むとクラッシュします。
これは私がやることができたベストです:
import os
fifo = "pipe_test.fifo"
done = False
fd = os.open(fifo, os.O_RDONLY | os.O_NONBLOCK)
while not done:
try:
s = os.read(fd, 1024) # buffer size may need tweaking
print(s)
done = True
except BlockingIOError as e:
pass
os.close(fd)
パイプ内のデータがありません場合、私はb""
を取得し、それが終了します。パイプにデータがある場合、例外を一度取得し、再試行してからデータを取得します。私は何かが間違っているように見え、奇妙な競争条件に遭遇するかもしれない。これを行うにはより良い方法がありますか?
ブロッキングパイプを待機する2番目のスレッドを使用できますか? – Jasper
@ジャスパー私はそれを行うことができました。それも理想的ではありませんが、私はそれが良いと認めます。また、低レベルの 'os'の代わりにPythonのファイルライブラリを使用することができます。これにより、改行などまで読み上げることができます。ありがとう、私は別のスレッドなしでチェックする方法がない限り、私のコードを変更するつもりです。 – sudo