Heim >Backend-Entwicklung >Python-Tutorial >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?
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.
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.
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.
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!