Riesgos de usar print en manejadores de señales Python

Fuentes: Risks of using print in Python signal handlers

El uso de la función print dentro de un manejador de señales en Python puede provocar fallos críticos bajo condiciones extremas, a pesar de que el intérprete CPython diseña estos mecanismos para evitar las restricciones estrictas del lenguaje C. Aunque Python permite ejecutar código arbitrario al recibir una señal porque difiere su ejecución hasta que el intérprete está en un estado consistente, los manejadores son reentrantes: si llega una nueva señal mientras se ejecuta la primera, el sistema intenta llamar al manejador nuevamente.

Un análisis técnico demuestra que enviar múltiples señales SIGUSR1 rápidamente puede interrumpir la ejecución de print en medio de su operación. Esto genera un error RuntimeError por llamada reentrante dentro del BufferedWriter de stdout, lo que causa el cierre abrupto del programa. Este comportamiento es específico de situaciones de estrés no habituales en aplicaciones reales, donde la frecuencia de señales rara vez alcanza niveles tan altos.

A diferencia de C, donde los manejadores inseguros pueden provocar bloqueos permanentes o corrupción de datos silenciosa, Python falla de manera explícita mediante excepciones. Por ello, este riesgo se considera una curiosidad técnica más que un obstáculo práctico mayor. No obstante, la recomendación estándar sigue siendo mantener los manejadores de señales lo más simples posible, limitándolos a establecer banderas booleanas y dejando el procesamiento complejo para el flujo principal del programa.