ホームページ >バックエンド開発 >Python チュートリアル >Python でマルチプロセッシングやスレッドを使用せずに、複数のサブプロセスを並行して実行し、その出力を収集するにはどうすればよいですか?
出力コレクションと並行してサブプロセスを実行する
指定されたシナリオでは、複数の cat | zgrep コマンドはリモート サーバー上で順番に実行されます。個々の出力を収集しながらこれらのコマンドを同時に実行するには、マルチプロセッシングやスレッドの使用を避ける必要があります。
簡単な解決策は、subprocess モジュールの Popen 関数を使用することです。コマンドごとに個別の Popen オブジェクトを作成し、それらにシェル引数を渡すことで、それらを並行して実行できます。コマンドが完了したら、wait メソッドを使用して終了コードを収集できます。以下に例を示します。
<code class="python">from subprocess import Popen # Create a list of commands commands = ['echo {i:d}; sleep 2; echo {i:d}' for i in range(5)] # Run commands in parallel processes = [Popen(command, shell=True) for command in commands] # Collect statuses exitcodes = [p.wait() for p in processes]</code>
このコードは 5 つのコマンドを同時に実行し、完了すると終了コードを収集します。
コマンドからの出力を収集するには、スレッドまたは通信メソッドは別のプロセスで実行します。たとえば、スレッド プールを使用する場合:
<code class="python">from multiprocessing.dummy import Pool # thread pool from subprocess import Popen # Run commands in parallel processes = [Popen(command, shell=True, close_fds=True) for command in commands] # Collect output in parallel def get_output(process): return process.communicate()[0] outputs = Pool(len(processes)).map(get_output, processes)</code>
このコードは、スレッド プールですべてのコマンドを同時に実行し、その出力をリストに収集します。各要素は個々のコマンドの出力に対応します。
もう 1 つの方法は、同じスレッドで出力収集に asyncio モジュールを使用することです (Python 3.8 以降):
<code class="python">import asyncio from subprocess import PIPE async def get_output(command): process = await asyncio.create_subprocess_shell(command, stdout=PIPE) return (await process.communicate()[0]).decode() # Get commands output in parallel coros = [get_output(command) for command in commands] outputs = await asyncio.gather(*coros)</code>
このコードは、コマンドを同時に実行し、その出力をリストとして返すコルーチンを作成します。
以上がPython でマルチプロセッシングやスレッドを使用せずに、複数のサブプロセスを並行して実行し、その出力を収集するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。