Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah anda boleh mencapai pelaksanaan serentak \'cat | perintah zgrep\' dalam Python sambil menguruskan output individu dengan cekap untuk pemprosesan selanjutnya?
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!