"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 manejar las interrupciones del teclado en el grupo de multiprocesamiento de Python?

¿Cómo manejar las interrupciones del teclado en el grupo de multiprocesamiento de Python?

Publicado el 2024-12-22
Navegar:187

How to Handle Keyboard Interrupts in Python\'s Multiprocessing Pool?

Manejo de interrupciones del teclado en el grupo de multiprocesamiento de Python

En el módulo de multiprocesamiento de Python, la clase Pool proporciona una manera conveniente de distribuir tareas entre múltiples procesos. Sin embargo, manejar eventos KeyboardInterrupt en Pools puede ser un desafío, como lo demuestra el fragmento de código:

from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()

Al ejecutar este código, presionar Ctrl C no activará el proceso de limpieza, lo que dejará los subprocesos ejecutándose indefinidamente. Para solucionar este problema, considere la siguiente solución alternativa:

El comportamiento observado en el código es consecuencia de un error de Python. KeyboardInterrupt no se envía cuando se espera una condición en threading.Condition.wait(). Como Pool.map() usa una condición de espera internamente, la interrupción nunca se recibe.

Una solución es usar Pool.map_async(), que permite especificar un tiempo de espera. Al establecer un tiempo de espera suficientemente largo (por ejemplo, 9999999), podemos garantizar que la interrupción se activará en un tiempo razonable.

Por lo tanto, reemplace:

    results = pool.map(slowly_square, range(40))

con:

    results = pool.map_async(slowly_square, range(40)).get(9999999)

Esta solución alternativa proporciona una forma de manejar con elegancia los eventos KeyboardInterrupt en grupos de multiprocesamiento, lo que permite la terminación de todos los subprocesos cuando el usuario cancela el programa.

Declaración de liberación Este artículo se reproduce en: 1729576640 Si hay alguna infracción, comuníquese con [email protected] para eliminarlo.
Ú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