es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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ón console_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ón apply_async se puede modificar como se muestra a continuación para incluir la función de devolución de llamada de error:

    def callback_error(result):
        print('error', result)
    
    pool.apply_async(console_log, (d,), error_callback=callback_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.

Comments are closed.