„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie führe ich nicht blockierende Unterprozesse in Python aus?

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

Veröffentlicht am 27.11.2024
Durchsuche:153

How to Execute Non-Blocking Subprocesses in Python?

Nicht blockierender Unterprozessaufruf

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:

subprocess.Popen(["python", "slave.py"]   sys.argv[1:])

Umfassendes Beispiel

Betrachten Sie für eine vollständige Demonstration nicht blockierender Unterprozessaufrufe den folgenden Code:

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)

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

Alternative Asynchroner Ansatz

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

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

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

Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729316657 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3