Maison > développement back-end > Tutoriel Python > Comment réaliser une exécution de sous-processus non bloquante en Python ?

Comment réaliser une exécution de sous-processus non bloquante en Python ?

Linda Hamilton
Libérer: 2024-10-19 13:47:02
original
363 Les gens l'ont consulté

How to Achieve Non-Blocking Subprocess Execution in 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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal