Maison  >  Article  >  développement back-end  >  Comment obtenir une exécution non bloquante de Subprocess.call en Python ?

Comment obtenir une exécution non bloquante de Subprocess.call en Python ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-19 13:53:02880parcourir

How to Achieve Non-Blocking Execution of Subprocess.call in Python?

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

  • Lors de l'utilisation de "shell= C'est vrai", n'oubliez pas d'éviter d'utiliser une liste pour transmettre des arguments, car cela peut entraîner des failles de sécurité.
  • Le MCVE (Minimal Complete Verifiable Sample) fourni montre les appels de sous-processus non bloquants utilisant à la fois "subprocess.Popen( )" et "asyncio", présentant le concept dans un cadre pratique.

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:
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