Heim > Artikel > Backend-Entwicklung > Wie erreicht man eine nicht blockierende Ausführung von Subprocess.call in Python?
Nicht blockierender subprocess.call: Erzielen einer parallelen Skriptausführung
Bei der Ausführung von asubprocess.call() in einem Python-Programm wird normalerweise der Aufrufer verwendet wartet, bis der Unterprozess abgeschlossen ist, bevor er fortfährt. Für bestimmte Anwendungen kann es jedoch wünschenswert sein, den Unterprozess nicht blockierend zu machen, sodass der Aufrufer die Ausführung fortsetzen kann, während der Unterprozess gleichzeitig ausgeführt wird.
Problemszenario
Stellen Sie sich das folgende Szenario vor: Sie möchten ein „slave.py“-Skript als nicht blockierenden subprocess.call() aus Ihrem „main.py“-Programm starten. Sie müssen Argumente von „main.py“ an „slave.py“ einmal übergeben, wenn letzteres zum ersten Mal gestartet wird, benötigen danach aber keine weitere Kommunikation zwischen den Skripten.
Lösung: subprocess.Popen
Um eine nicht blockierende Ausführung von „slave.py“ zu erreichen, ersetzen Sie „subprocess.call()“ durch „subprocess.Popen()“ in „main.py“. Anstatt auf den Unterprozess zu warten Zum Abschluss kehrt „subprocess.Popen()“ sofort zurück und ermöglicht „main.py“, seine Vorgänge fortzusetzen.
Codebeispiel
<code class="python">import subprocess import sys subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>
Alternative: asyncio
Für neuere Versionen von Python (3.5 oder höher) können Sie das Modul „asyncio“ verwenden, um nicht blockierende Unterprozessaufrufe zu implementieren. Dieser Ansatz nutzt die Parallelität mit Coroutinen, um mehrere Aufgaben auszuführen gleichzeitig.
Codebeispiel (asyncio)
<code class="python">import asyncio async def do_subprocess(): proc = await asyncio.create_subprocess_exec('sleep', '5') returncode = await proc.wait() print(f'Subprocess done sleeping. Return code = {returncode}') loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.gather(do_subprocess())) loop.close()</code>
Zusätzliche Hinweise
Das obige ist der detaillierte Inhalt vonWie erreicht man eine nicht blockierende Ausführung von Subprocess.call in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!