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

Susan Sarandon
Freigeben: 2024-10-19 13:45:29
Original
484 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!