Subprocess.call non bloquant : réalisation d'une exécution de script parallèle
Lors de l'exécution de asubprocess.call() dans un programme Python, l'appelant est généralement attend la fin du sous-processus avant de continuer. Cependant, pour certaines applications, il peut être souhaitable de rendre le sous-processus non bloquant, permettant à l'appelant de poursuivre l'exécution pendant que le sous-processus s'exécute simultanément.
Scénario de problème
Considérez le scénario suivant : vous souhaitez démarrer un script "slave.py" en tant que subprocess.call() non bloquant à partir de votre programme "main.py". Vous devez transmettre les arguments de "main.py" à "slave.py" une fois lors du premier démarrage de ce dernier, mais ne nécessitez aucune communication supplémentaire entre les scripts par la suite.
Solution : subprocess.Popen
Pour obtenir une exécution non bloquante de "slave.py", remplacez "subprocess.call()" par "subprocess.Popen() dans "main.py". Au lieu d'attendre le sous-processus pour terminer, "subprocess.Popen()" revient immédiatement, permettant à "main.py" de poursuivre ses opérations.
Exemple de code
<code class="python">import subprocess import sys subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>
Alternative : asyncio
Pour les versions plus récentes de Python (3.5 ou ultérieure), vous pouvez utiliser le module "asyncio" pour implémenter des appels de sous-processus non bloquants. Cette approche exploite la concurrence avec les coroutines pour exécuter plusieurs tâches. simultanément.
Exemple de code (asyncio)
<code class="python">import asyncio async def do_subprocess(): proc = await asyncio.create_subprocess_exec('sleep', '5') returncode = await proc.wait() print(f'Subprocess done sleeping. Return code = {returncode}') loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.gather(do_subprocess())) loop.close()</code>
Notes supplémentaires
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!