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

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

DDD
リリース: 2024-12-19 13:55:11
オリジナル
773 人が閲覧しました

How Can I Achieve Non-Blocking Reads from Subprocess Pipes in Python?

Python のサブプロセス パイプでのノンブロッキング読み取り

サブプロセス パイプは、Python 内から外部プログラムと通信する方法を提供します。ただし、デフォルトでは、標準出力からの読み取りは、データが使用可能になるまでプロセスをブロックします。ノンブロッキング読み取りを必要とするアプリケーションの場合、考慮すべきアプローチがいくつかあります。

fcntl、select、および asyncproc を避ける

一般的に推奨されているのは、fcntl、select、および asyncprocこのシナリオには適していない可能性があります。 fcntl と select はプラットフォーム固有のコードを必要としますが、asyncproc はマルチプロセッシングに依存しているため、追加のオーバーヘッドが発生し、パイプとのやり取りが不十分になる可能性があります。

キューベースのソリューション

信頼性の高いソリューション移植可能な解決策は、Queue.get_nowait() 呼び出しを使用することです。その仕組みは次のとおりです。

from queue import Queue, Empty
from subprocess import PIPE, Popen
from threading import Thread

# Initialize a subprocess and a queue for output
p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1)
q = Queue()

# Create a thread to enqueue output from the subprocess
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True
t.start()

# Read the queue in a non-blocking manner
try:
    line = q.get_nowait()
except Empty:
    print('No output yet')
else:
    # ... process the output line
ログイン後にコピー

このアプローチでは、サブプロセスからの出力をキューに入れるために別のスレッドが使用されます。メインプロセスは、ブロックせずにキューからデータを取得しようとします。キューが空の場合、空の例外が返されます。

このソリューションは移植性と効率性の両方を備え、プラットフォーム固有のコードや追加の依存関係を必要とせずに、サブプロセス パイプでのノンブロッキング読み取りを可能にします。

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

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