この Python スクリプトでは、複数の 'cat | zgrep' コマンドが同時に実行されます。 zgrep' コマンドはリモート サーバー上で順次実行され、その出力は処理のために個別に収集されます。ただし、効率を高めるために、これらのコマンドを並列実行することを目指しています。
マルチプロセッシングまたはスレッドの使用とは対照的に、次のアプローチを使用してサブプロセスを並列実行できます。
<code class="python">#!/usr/bin/env python from subprocess import Popen # create a list of subprocesses processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True) for i in range(5)] # collect statuses of subprocesses exitcodes = [p.wait() for p in processes]</code>
このコードは 5 つのシェル コマンドを同時に起動し、それらの終了コードを収集します。 Popen はデフォルトでコマンドの完了を待機しないため、このコンテキストでは & 文字は必要ないことに注意してください。ステータスを取得するには、明示的に .wait() を呼び出す必要があります。
サブプロセスから出力を順番に収集するのは便利ですが、必要に応じてスレッドを使用して並列収集することもできます。 。次の例を考えてみましょう。
<code class="python">#!/usr/bin/env python from multiprocessing.dummy import Pool # thread pool from subprocess import Popen, PIPE, STDOUT # create a list of subprocesses with output handling processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) for i in range(5)] # collect outputs in parallel def get_lines(process): return process.communicate()[0].splitlines() outputs = Pool(len(processes)).map(get_lines, processes)</code>
このコードはサブプロセスを並列で実行し、スレッドを使用してその出力を同時に収集します。
Python バージョン 3.8 および上で述べたように、asyncio はサブプロセスを同時に実行するエレガントな方法を提供します。以下に例を示します。
<code class="python">#!/usr/bin/env python3 import asyncio import sys from subprocess import PIPE, STDOUT async def get_lines(shell_command): p = await asyncio.create_subprocess_shell( shell_command, stdin=PIPE, stdout=PIPE, stderr=STDOUT ) return (await p.communicate())[0].splitlines() async def main(): # create a list of coroutines for subprocess execution coros = [get_lines(f'"{sys.executable}" -c "print({i:d}); import time; time.sleep({i:d})"') for i in range(5)] # get subprocess outputs in parallel print(await asyncio.gather(*coros)) if __name__ == "__main__": asyncio.run(main())</code>
このコードは、単一のスレッド内でサブプロセスを同時に実行する方法を示しています。
これらのアプローチを実装すると、複数の ' を実行することでスクリプトの効率を大幅に向上させることができます。猫 | 猫zgrep' コマンドをリモート サーバー上で並行して実行します。
以上が複数の \'cat | を実行する方法zgrep\' コマンドを Python で同時に実行しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。