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