Dalam senario pemprosesan selari, pelaksanaan berurutan boleh menjadi halangan. Untuk memintas isu ini, terokai cara melaksanakan berbilang 'cat | perintah zgrep' serentak dalam Python sambil mengekalkan output individu untuk pemprosesan selanjutnya.
Untuk pelaksanaan subproses serentak tanpa menggunakan berbilang pemprosesan atau threading, pertimbangkan pendekatan berikut:
<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>
Kod ini melancarkan lima perintah shell secara selari tanpa memerlukan '&' atau panggilan '.wait()' eksplisit.
Untuk pengumpulan output subproses serentak , benang boleh digunakan:
<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>
Kod ini mengumpulkan output subproses secara selari menggunakan kumpulan benang.
Dalam Python 3.8 , asyncio boleh digunakan untuk pengumpulan output serentak dalam satu urutan:
<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>
Kod ini melaksanakan subproses dan mengumpul outputnya secara tidak segerak, menghapuskan keperluan untuk berbilang pemprosesan atau penjalinan.
Atas ialah kandungan terperinci Bagaimanakah anda boleh mencapai pelaksanaan serentak 'cat | perintah zgrep' dalam Python sambil menguruskan output individu dengan cekap untuk pemprosesan selanjutnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!