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