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?

Bagaimanakah anda boleh mencapai pelaksanaan serentak \'cat | perintah zgrep\' dalam Python sambil menguruskan output individu dengan cekap untuk pemprosesan selanjutnya?

Linda Hamilton
Linda Hamiltonasal
2024-10-27 07:04:03288semak imbas

How can you achieve concurrent execution of 'cat | zgrep' commands in Python while efficiently managing individual output for further processing?

Python: Pelaksanaan Serentak bagi Subproses 'kucing'

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.

Keselarasan dengan Modul subproses

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.

Concurrency with Thread Pool

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.

Koleksi Output Asynchronous (Python 3.8 )

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!

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