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

Python でノンブロッキングのサブプロセス パイプ読み取りを実現するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-17 05:30:25
オリジナル
969 人が閲覧しました

How to Achieve Non-Blocking Subprocess Pipe Reads in Python?

Python でサブプロセス パイプでノンブロッキング読み取りを実行する方法

Python でサブプロセス モジュールを使用する場合、次のことが必要になる場合があります。サブプロセスの出力ストリームでノンブロッキング読み取りを実行します。これにより、利用可能なデータがない可能性のあるプロセスからの読み取り時にプログラムがブロックされなくなります。

従来のブロック読み取り

通常、次のコードは次のようになります。サブプロセスの標準出力から読み取るために使用されます:

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()
ログイン後にコピー

ただし、このアプローチでは、データが読み込まれるまでプログラムの実行がブロックされます。標準出力で利用できます。

ノンブロッキング読み取り

ノンブロッキング読み取りを実装する一般的な方法の 1 つは、Python キュー モジュールの Queue クラスを使用することです。以下に例を示します。

import sys
from subprocess import PIPE, Popen
from threading  import Thread
try:
    from queue import Queue, Empty
except ImportError:
    from Queue import Queue, Empty  # python 2.x

ON_POSIX = 'posix' in sys.builtin_module_names

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()

# ... do other things here

# read line without blocking
try:  line = q.get_nowait() # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else: # got line
    # ... do something with line
ログイン後にコピー

このコードでは、enqueue_output 関数が別のスレッドで実行され、出力がサブプロセスの stdout から断続的にサブプロセスに出力されます。列にデータがあるかどうか。データがない場合は開始されます。空ですが、成功した場合は、抽出された行が返されます。

以上がPython でノンブロッキングのサブプロセス パイプ読み取りを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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