Rumah > pembangunan bahagian belakang > Tutorial Python > 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
Lepaskan: 2024-10-27 07:04:03
asal
434 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan