El programa Python no muestra un error al ser llamado con parámetros incorrectos en apply_async.
Hola, este es un ejemplo de muestra de algo que quiero hacer. Quiero usar hilos en mi aplicación. Funciona bien, el problema es que Python no arroja un error cuando por error llamo a la función con un parámetro incorrecto, lo que a veces hace que sea más difícil depurar.
Programa de muestra: como puede ver, estoy llamando a la función console_log
con el número incorrecto de argumentos. Cuando ejecuto el programa, no hay salida y sale.
from multiprocessing.pool import ThreadPool
def console_log(id, msg):
print("{} : {}".format(id, msg))
data = [1,2,3,4,5,6]
max_threads = 1
pool = ThreadPool(processes=max_threads)
for d in data:
pool.apply_async(console_log, (d))
pool.close()
pool.join()
Mismo programa pero sin hilos y piscinas
def console_log(id, msg):
print("{} : {}".format(id, msg))
data = [1,2,3,4,5,6]
for d in data:
console_log(d)
output
Traceback (most recent call last):
File "async.py", line 12, in <module>
console_log(d)
TypeError: console_log () falta 1 argumento posicional requerido: 'msg'
¿Por qué no obtengo la misma salida de error cuando uso ThreadPool? ¿Hay alguna manera de obtener ese mensaje de error? Estoy usando la versión de Python 3.8.10.
ACTUALIZACIÓN
callback_error se puede usar para devolver el error. Entonces, la llamada a la función se convierte en algo como esto:
def callback_error(result):
print('error', result)
pool.apply_async(console_log, (d,), error_callback=callback_error)
Lo encontré a través de sugerencias de preguntas. Enlace: https://stackoverflow.com/questions/6728236/exception-thrown-in-multiprocessing-pool-not-detected
davy.ai
Al utilizar hilos y grupos de hilos en Python, los errores no siempre se lanzan de inmediato, lo que dificulta la depuración. Esto es evidente en el programa de muestra dado donde se llama a la función
console_log()
con el número incorrecto de argumentos. Cuando el programa se ejecuta con ThreadPool, no se ve ninguna salida ni error, y simplemente se cierra. Sin embargo, cuando se ejecuta el mismo programa sin hilos ni grupos de hilos, se produce un error que indica que se llamó a la funciónconsole_log()
con un argumento faltante.Para obtener el mensaje de error al usar ThreadPool, se puede usar
error_callback
para devolver el error. La funciónapply_async
se puede modificar como se muestra a continuación para incluir la función de devolución de llamada de error:Esto imprimirá el mensaje de error y lo hará más fácil de depurar. La función de devolución de llamada de error se llama cuando se produce una excepción en el proceso del trabajador.
Es importante tener en cuenta que la función de devolución de llamada de error es opcional y su uso puede tener implicaciones en el rendimiento.