Pregunta

Hoy me encontré con el hecho de que sys.exit () llamado desde un subproceso hijo no detiene el proceso principal. No sabía esto antes, y esto está bien, pero necesitaba mucho tiempo para darme cuenta de esto. Habría ahorrado mucho tiempo , si sys.exit (msg) hubiera impreso msg en stderr . Pero no fue así.

Resultó que no era un error real en mi aplicación; llamó a sys.exit (msg) con un error significativo de forma volitiva, pero no pude ver esto.

En los documentos para sys.exit () se afirma : " [...] cualquier otro objeto se imprime en sys.stderr y da como resultado un código de salida de 1 "

Esto no es cierto para una llamada de un subproceso secundario, donde sys.exit () obviamente se comporta como thread.exit () : " Elevar la excepción de SystemExit. Cuando no se detecta, esto hará que el hilo salga de silenciosamente"

Creo que cuando un programador desea que sys.exit (msg) imprima un mensaje de error, esto debería imprimirse, independientemente del lugar desde donde se llame. Por qué no? Actualmente no veo ninguna razón. Al menos debería haber una sugerencia en los documentos para sys.exit () de que el mensaje no se imprime desde subprocesos.

¿Qué piensas? ¿Por qué se ocultan los mensajes de error de los hilos? ¿Esto tiene sentido?

Saludos cordiales,

Jan-Philip Gehrcke

¿Fue útil?

Solución

Estoy de acuerdo en que los documentos de Python son incorrectos, o quizás más incompletos, con respecto a sys.exit y SystemExit cuando son llamados / generados por hilos distintos al principal; abra un problema con el documento en el rastreador en línea de Python para poder solucionarlo en una futura versión de los documentos (probablemente en el futuro próximo: las correcciones de documentos son más fáciles y suaves que las correcciones de código ;-).

El remedio es bastante fácil, por supuesto, simplemente envuelva cualquier función que esté utilizando como objetivo de un hilo . Hilo con un decorador que haga un intento / excepto SystemExit, e: a su alrededor, y ejecuta " escribir en stderr " la funcionalidad adicional que necesita (o, quizás mejor, utiliza una llamada logging.error en su lugar) antes de terminar. Pero, con el problema documental que señala correctamente, es difícil pensar en hacerlo a menos que uno se haya encontrado con el problema y, de hecho, haya tenido que dedicar algo de tiempo a la depuración para precisarlo, como lo ha hecho. do (en el nombre colectivo de los desarrolladores de python principales, ¡lo siento!).

Otros consejos

No todos los hilos en python son iguales. Al llamar a sys.exit desde un hilo, en realidad no sale del sistema. Por lo tanto, llamar a sys.exit () desde un subproceso secundario no tiene sentido, por lo que tiene sentido que no se comporte de la forma esperada.

Esta página habla más sobre los objetos de subprocesamiento, y las diferencias entre los subprocesos y especial " principal " hilo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top