"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo ejecutar subprocesos sin bloqueo en Python?

¿Cómo ejecutar subprocesos sin bloqueo en Python?

Publicado el 2024-11-27
Navegar:293

How to Execute Non-Blocking Subprocesses in Python?

Invocación de subproceso sin bloqueo

Al ejecutar scripts externos usando subprocess.call, mantener un flujo de trabajo sin bloqueo es esencial para evitar detener el programa principal. Este artículo presenta una solución integral para lograr este objetivo.

Enfoque utilizando subprocess.Popen

El método principal para ejecutar un subproceso sin bloqueo es emplear subprocess.Popen en lugar de subprocess.call. Esta alternativa no bloquea el programa principal, permitiéndole continuar sus operaciones mientras el subproceso se ejecuta de forma independiente. Aquí hay un ejemplo:

subprocess.Popen(["python", "slave.py"]   sys.argv[1:])

Ejemplo completo

Para una demostración completa de las llamadas a subprocesos sin bloqueo, considere el siguiente código:

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)

Este código ejecuta el comando 'dormir' de forma asincrónica, comprobando periódicamente su estado hasta que se completa.

Alternativa Enfoque asincrónico

Para las versiones 3.5 y superiores de Python, un enfoque más moderno y eficiente implica el uso de asyncio. Permite una verdadera concurrencia, lo que permite ejecutar múltiples tareas simultáneamente. Aquí hay un ejemplo:

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()

Este enfoque garantiza que tanto el subproceso como el programa principal se ejecuten simultáneamente, maximizando el rendimiento y la capacidad de respuesta.

Declaración de liberación Este artículo se reimprime en: 1729316657 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3