Heim >Backend-Entwicklung >Python-Tutorial >Wie führe ich nicht blockierende Unterprozesse in Python aus?

Wie führe ich nicht blockierende Unterprozesse in Python aus?

Susan Sarandon
Susan SarandonOriginal
2024-10-19 13:45:29585Durchsuche

How to Execute Non-Blocking Subprocesses in Python?

Nicht blockierender Subprozessaufruf

Beim Ausführen externer Skripte mit subprocess.call ist die Aufrechterhaltung eines nicht blockierenden Workflows unerlässlich, um ein Abwürgen des Hauptprogramms zu vermeiden. Dieser Artikel stellt eine umfassende Lösung zum Erreichen dieses Ziels vor.

Ansatz mit subprocess.Popen

Die primäre Methode zum Ausführen eines nicht blockierenden Unterprozesses ist die Verwendung von subprocess.Popen anstelle von subprocess.call. Diese Alternative blockiert das Hauptprogramm nicht und ermöglicht ihm, seine Operationen fortzusetzen, während der Unterprozess unabhängig ausgeführt wird. Hier ist ein Beispiel:

<code class="python">subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>

Umfassendes Beispiel

Für eine vollständige Demonstration nicht blockierender Unterprozessaufrufe betrachten Sie den folgenden Code:

<code class="python">import subprocess
import time

p = subprocess.Popen(['sleep', '5'])

while p.poll() is None:
    print('Still sleeping')
    time.sleep(1)

print('Not sleeping any longer.  Exited with returncode %d' % p.returncode)</code>

Dieser Code führt die aus 'sleep'-Befehl asynchron und überprüft regelmäßig seinen Status, bis er abgeschlossen ist.

Alternativer asynchroner Ansatz

Für Python-Versionen 3.5 und höher umfasst ein modernerer und effizienterer Ansatz die Verwendung von Asyncio. Es ermöglicht echte Parallelität und ermöglicht die gleichzeitige Ausführung mehrerer Aufgaben. Hier ist ein Beispiel:

<code class="python">import asyncio

async def do_subprocess():
    print('Subprocess sleeping')
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    returncode = await proc.wait()
    print('Subprocess done sleeping.  Return code = %d' % returncode)

async def sleep_report(number):
    for i in range(number + 1):
        print('Slept for %d seconds' % i)
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()

tasks = [
    asyncio.ensure_future(do_subprocess()),
    asyncio.ensure_future(sleep_report(5)),
]

loop.run_until_complete(asyncio.gather(*tasks))
loop.close()</code>

Dieser Ansatz stellt sicher, dass sowohl der Unterprozess als auch das Hauptprogramm gleichzeitig ausgeführt werden, wodurch Leistung und Reaktionsfähigkeit maximiert werden.

Das obige ist der detaillierte Inhalt vonWie führe ich nicht blockierende Unterprozesse in Python aus?. 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