Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man eine nicht blockierende Ausführung von Subprocess.call in Python?

Wie erreicht man eine nicht blockierende Ausführung von Subprocess.call in Python?

Barbara Streisand
Barbara StreisandOriginal
2024-10-19 13:53:02878Durchsuche

How to Achieve Non-Blocking Execution of 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

  • Bei Verwendung von „shell= Richtig, denken Sie daran, die Verwendung einer Liste zur Übergabe von Argumenten zu vermeiden, da dies zu Sicherheitslücken führen kann.
  • Das bereitgestellte MCVE (Minimal Complete Verifiable Beispiel) demonstriert nicht blockierende Unterprozessaufrufe unter Verwendung von „subprocess.Popen( )“ und „asyncio“, die das Konzept in einer praktischen Umgebung präsentieren.

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!

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