Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Sie die gleichzeitige Ausführung von \'cat | erreichen? zgrep\'-Befehle in Python ausführen und gleichzeitig einzelne Ausgaben für die weitere Verarbeitung effizient verwalten?

Wie können Sie die gleichzeitige Ausführung von \'cat | erreichen? zgrep\'-Befehle in Python ausführen und gleichzeitig einzelne Ausgaben für die weitere Verarbeitung effizient verwalten?

Linda Hamilton
Linda HamiltonOriginal
2024-10-27 07:04:03369Durchsuche

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

Python: Gleichzeitige Ausführung von „Cat“-Unterprozessen

In parallelen Verarbeitungsszenarien kann die sequentielle Ausführung ein Engpass sein. Um dieses Problem zu umgehen, erfahren Sie, wie Sie mehrere „cat |“-Befehle ausführen zgrep'-Befehle gleichzeitig in Python ausführen und dabei die individuelle Ausgabe für die weitere Verarbeitung beibehalten.

Parallelität mit dem Unterprozessmodul

Für die gleichzeitige Ausführung von Unterprozessen ohne Rückgriff auf Multiprocessing oder Threading sollten Sie den folgenden Ansatz in Betracht ziehen:

<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>

Dieser Code startet fünf Shell-Befehle parallel, ohne dass „&“ oder explizite „.wait()“-Aufrufe erforderlich sind.

Parallelität mit Thread-Pool

Für die gleichzeitige Sammlung von Unterprozessausgaben , Threads können verwendet werden:

<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>

Dieser Code sammelt die Ausgabe von Unterprozessen parallel mithilfe eines Thread-Pools.

Asynchrone Ausgabesammlung (Python 3.8)

In Python 3.8 , asyncio kann für die gleichzeitige Ausgabeerfassung in einem einzelnen Thread verwendet werden:

<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>

Dieser Code führt die Unterprozesse aus und sammelt ihre Ausgabe asynchron, sodass keine Mehrfachverarbeitung oder Threading erforderlich ist.

Das obige ist der detaillierte Inhalt vonWie können Sie die gleichzeitige Ausführung von \'cat | erreichen? zgrep\'-Befehle in Python ausführen und gleichzeitig einzelne Ausgaben für die weitere Verarbeitung effizient verwalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn