Cuando se trabaja con el grupo de multiprocesamiento de Python, manejar los eventos de KeyboardInterrupt no siempre es sencillo. En este artículo, exploraremos cómo manejar dichas interrupciones y garantizar que los procesos finalicen correctamente.
El código de ejemplo proporcionado demuestra el desafío. A pesar de tener un bloque catch para KeyboardInterrupt, no se ejecuta cuando se presiona control-C. En cambio, el programa se bloquea hasta que se finaliza externamente.
La raíz de este problema radica en un error de Python relacionado con el bloqueo de una condición en threading.Condition.wait(). En este contexto, KeyboardInterrupt nunca se envía. Como resultado, evita que la interrupción se maneje dentro del grupo.
Una solución a este problema es especificar un tiempo de espera al esperar los resultados. Se puede utilizar el método map_async() con un parámetro de tiempo de espera en lugar de map(). Este enfoque permite reconocer y procesar KeyboardInterrupt:
results = pool.map_async(slowly_square, range(40)).get(9999999)
Estableciendo un valor de tiempo de espera grande , básicamente le decimos al Pool que continúe esperando los resultados hasta que el usuario lo interrumpa.
Es importante tener en cuenta que existen algunas limitaciones para esto. solución alternativa. Si el tiempo de espera expira antes de que se completen todas las tareas, los resultados incompletos se descartarán. Por lo tanto, es fundamental elegir un valor de tiempo de espera adecuado que equilibre la capacidad de respuesta con el riesgo de resultados incompletos.
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