並列処理シナリオでは、順次実行がボトルネックになる可能性があります。この問題を回避するには、複数の 'cat | を実行する方法を調べてください。 zgrep' コマンドを Python で同時に実行しながら、個別の出力をさらなる処理のために保持します。
マルチプロセッシングやスレッド化に頼らずにサブプロセスを同時実行するには、次のアプローチを検討してください。
<code class="python">#!/usr/bin/env python from subprocess import Popen # Initialize processes processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True) for i in range(5)] # Gather execution statuses exitcodes = [p.wait() for p in processes]</code>
このコードは、'&' や明示的な '.wait()' 呼び出しを必要とせずに、5 つのシェル コマンドを並行して起動します。
同時サブプロセス出力収集用、スレッドを使用できます:
<code class="python">#!/usr/bin/env python from multiprocessing.dummy import Pool from subprocess import Popen, PIPE, STDOUT # Create processes 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 output 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(): # Concurrent command execution coros = [ get_lines( f'"{sys.executable}" -c "print({i:d}); import time; time.sleep({i:d})"' ) for i in range(5) ] print(await asyncio.gather(*coros)) if __name__ == "__main__": asyncio.run(main())</code>
このコードは、サブプロセスを実行してその出力を非同期に収集し、マルチプロセッシングやスレッド化の必要性を排除します。
以上が'cat | の同時実行を実現するにはどうすればよいですか? Python で zgrep' コマンドを実行しながら、さらなる処理のために個々の出力を効率的に管理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。