"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 puedo cancelar funciones de Python de larga duración mediante tiempos de espera?

¿Cómo puedo cancelar funciones de Python de larga duración mediante tiempos de espera?

Publicado el 2024-12-23
Navegar:926

How Can I Cancel Long-Running Python Functions Using Timeouts?

Cancelación de llamadas a funciones de larga duración con tiempos de espera

Al ejecutar secuencias de comandos complejas que incluyen funciones potencialmente detenidas, es deseable proporcionar una forma de finalizar estas funciones si exceden un tiempo de ejecución específico. Esto garantiza que el script no deje de responder ni permanezca bloqueado indefinidamente.

En Python, aprovechar el paquete de señales (disponible en sistemas UNIX) ofrece una solución para este problema. Al registrar un controlador de señales, puede establecer un tiempo de espera para una llamada de función. Si la función tarda más del tiempo especificado, se invoca el controlador, lo que le permite manejar la situación de manera adecuada.

Considere el siguiente fragmento de código:

import signal

# Register a signal handler for the timeout
def handler(signum, frame):
    print("Forever is over!")
    raise Exception("end of time")

# Define a function that may run for an indetermined time
def loop_forever():
    import time
    while 1:
        print("sec")
        time.sleep(1)

# Register the signal function handler
signal.signal(signal.SIGALRM, handler)

# Define a timeout for the function
signal.alarm(10)

try:
    loop_forever()
except Exception as exc:
    print(exc)

# Cancel the timer if the function returned before timeout
signal.alarm(0)

En este ejemplo, registramos la función de controlador para manejar la señal de tiempo de espera. Luego definimos nuestra función loop_forever de larga duración, que imprime continuamente el mensaje "seg" cada segundo.

Después de establecer un tiempo de espera de 10 segundos usando signal.alarm(10), intentamos ejecutar loop_forever. Si la función tarda más de 10 segundos en ejecutarse, se invoca nuestro controlador de señales e imprime "¡Para siempre se acabó!" y generar una excepción.

Para garantizar un manejo adecuado del escenario de tiempo de espera, es esencial cancelar el temporizador si la función regresa antes del tiempo especificado. En nuestro ejemplo, llamamos a signal.alarm(0) para cancelar el temporizador cuando se genera la excepción.

Tenga en cuenta que es posible que el paquete de señales no interactúe bien con entornos de subprocesos múltiples. Además, si una función detecta e ignora las excepciones generadas durante el tiempo de espera, es posible que el mecanismo de tiempo de espera no sea efectivo.

Ú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