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

Barbara Streisand
Libérer: 2024-10-19 13:53:02
original
776 Les gens l'ont consulté

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

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

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!

source:php
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!