ホームページ >バックエンド開発 >Python チュートリアル >Python でマルチプロセッシングやスレッドを使用せずに、複数のサブプロセスを並行して実行し、その出力を収集するにはどうすればよいですか?

Python でマルチプロセッシングやスレッドを使用せずに、複数のサブプロセスを並行して実行し、その出力を収集するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 21:51:031086ブラウズ

How can I run multiple subprocesses in parallel and collect their output without using multiprocessing or threading in 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。