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

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

DDD
リリース: 2024-12-17 22:06:12
オリジナル
181 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート