Python でのサブプロセス出力ストリームのノンブロッキング読み取り
Python では、サブプロセス モジュールを起動して外部と対話する便利な方法を提供します。プロセス。ただし、親プロセスと子プロセスの間の I/O インタラクションを効率的に処理することが重要です。
次のシナリオを考えてみましょう。サブプロセスの標準出力ストリームでノンブロッキング読み取りを実行したいとします。デフォルトでは、p.stdout.readline() はバッファーでデータが使用可能になるまでブロックします。これに対処するために、別個のスレッドとキューを使用する手法を採用できます。
まず、出力行を保存するキューを作成します。
from Queue import Queue
次に、読み取りスレッドを開始します。サブプロセスの標準出力から行を取得し、それらをキューに入れます:
def enqueue_output(out, queue): for line in iter(out.readline, b''): queue.put(line) out.close()
サブプロセスを初期化し、 thread:
p = Popen(['myprogram.exe'], stdout=PIPE) q = Queue() t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True t.start()
ノンブロッキングで行を読み取るには、次を使用します:
try: line = q.get_nowait() # or q.get(timeout=.1) except Empty: print('no output yet') else: # got line # do something with the line
このメソッドはクロスプラットフォーム互換性があり、ノンブロッキング読み取りを保証するため、効率的にサブプロセスからのプロセス データ。
以上がPython でサブプロセスの出力ストリームから非ブロック読み取りを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。