Maison >développement back-end >Tutoriel Python >Comment réaliser une exécution de sous-processus non bloquante en Python ?
Exécution de sous-processus non bloquante
Pour obtenir une exécution de sous-processus non bloquante, envisagez d'utiliser subprocess.Popen au lieu de subprocess.call. subprocess.call attend la fin de la commande avant de revenir, tandis que subprocess.Popen démarre immédiatement le sous-processus et renvoie un objet semblable à un fichier.
<code class="python">import subprocess subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>
En utilisant subprocess.Popen, vous pouvez transmettre des arguments à l'esclave. py et lui permettre de s'exécuter indépendamment de main.py. slave.py peut ensuite exécuter ses tâches sans bloquer main.py.
<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>
Dans Python 3.5 et versions ultérieures, vous pouvez également utiliser des coroutines pour obtenir le parallélisme et l'exécution non bloquante des sous-processus.
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!