Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara Melaksanakan Berbilang \'cat | zgrep\' Perintah serentak dalam Python?

Cara Melaksanakan Berbilang \'cat | zgrep\' Perintah serentak dalam Python?

DDD
DDDasal
2024-10-27 07:09:29227semak imbas

How to Execute Multiple 'cat | zgrep' Commands Concurrently in Python?

Laksanakan Berbilang 'kucing | zgrep' Perintah Serentak

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.

Menggunakan Subproses Tanpa Benang

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.

Subproses dengan Koleksi Output

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.

Pelaksanaan Selari Berasaskan Asyncio

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn