Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man eine nicht blockierende Subprozessausführung in Python?

Wie erreicht man eine nicht blockierende Subprozessausführung in Python?

Linda Hamilton
Linda HamiltonOriginal
2024-10-19 13:47:02210Durchsuche

How to Achieve Non-Blocking Subprocess Execution in Python?

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!

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