Nicht blockierende Subprozessausführung
Um eine nicht blockierende Subprozessausführung zu erreichen, sollten Sie subprocess.Popen anstelle von subprocess.call verwenden. subprocess.call wartet auf den Abschluss des Befehls, bevor es zurückkehrt, während subprocess.Popen den Unterprozess sofort startet und ein dateiähnliches Objekt zurückgibt.
<code class="python">import subprocess subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>
Mit subprocess.Popen können Sie Argumente an den Slave übergeben. py und lassen Sie es unabhängig von main.py laufen. Slave.py kann dann seine Aufgaben ausführen, ohne Main.py zu blockieren.
<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>
In Python 3.5 und höher können Sie auch Coroutinen verwenden, um Parallelität und nicht blockierende Unterprozessausführung zu erreichen.
<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>
Das obige ist der detaillierte Inhalt vonWie erreicht man eine nicht blockierende Subprozessausführung in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!