ホームページ >バックエンド開発 >Python チュートリアル >Python でサブプロセスの出力ストリームから非ブロック読み取りを実行するにはどうすればよいですか?

Python でサブプロセスの出力ストリームから非ブロック読み取りを実行するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-17 22:06:12183ブラウズ

How Can I Perform Non-Blocking Reads from a Subprocess's Output Stream in Python?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。