Dalam skrip Python ini, berbilang 'cat | Perintah zgrep' dilaksanakan secara berurutan pada pelayan jauh dan outputnya dikumpul secara individu untuk diproses. Walau bagaimanapun, untuk meningkatkan kecekapan, kami menyasarkan untuk melaksanakan arahan ini secara selari.
Bertentangan dengan menggunakan multiproses atau benang, anda boleh melaksanakan subproses secara selari menggunakan pendekatan berikut:
<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>
Kod ini melancarkan lima arahan shell secara serentak dan mengumpul kod keluarnya. Ambil perhatian bahawa watak & tidak diperlukan dalam konteks ini kerana Popen tidak menunggu arahan untuk diselesaikan secara lalai. Anda mesti memanggil .wait() secara eksplisit untuk mendapatkan semula status mereka.
Walaupun mudah untuk mengumpul output daripada subproses secara berurutan, anda juga boleh menggunakan urutan untuk pengumpulan selari jika mahu . Pertimbangkan contoh berikut:
<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>
Kod ini menjalankan subproses secara selari dan mengumpul outputnya secara serentak menggunakan benang.
Untuk Python versi 3.8 dan di atas, asyncio menawarkan cara yang elegan untuk melaksanakan subproses secara serentak. Berikut ialah contoh:
<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>
Kod ini menunjukkan cara menjalankan subproses serentak dalam satu urutan.
Dengan melaksanakan pendekatan ini, anda boleh meningkatkan kecekapan skrip anda dengan ketara dengan melaksanakan berbilang ' kucing | perintah zgrep' selari pada pelayan jauh.
Atas ialah kandungan terperinci Cara Melaksanakan Berbilang 'cat | zgrep' Perintah serentak dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!