Manejadores de señal y registro en Python.

La documentación para el módulo de registro dice que

Si está implementando manejadores de señales asíncronos utilizando el módulo de señales, es posible que no pueda usar el registro desde dichos manejadores. Esto se debe a que las implementaciones de locking en el módulo de subprocesamiento no siempre son reingresantes, por lo que no pueden invocarse desde dichos manejadores de señales.

Esto sugiere que uno no debe hacer llamadas de registro desde el código invocado por el controlador de señales directa o indirectamente. Si lo haces de vez en cuando el progtwig se dejará es un estado en el que solo matar a -9 ayuda.

Pregunta importante para mí ahora es seguir. ¿Este problema de locking también puede ocurrir cuando otros subprocesos llaman a los métodos de registro en el momento en que el subproceso principal está procesando una señal ?

Los manejadores de señales necesitan un manejo especial en la progtwigción UNIX. Solo una lista definida de funciones POSIX C se declara como reentrante y se puede llamar dentro de un controlador de señales POSIX. IEEE Std 1003.1 enumera 118 funciones reentrantes de UNIX que puede encontrar en https://www.opengroup.org/ (es necesario iniciar sesión).

Pero las señales de Python son asíncronas: el módulo de señal tiene una aclaración:

Aunque los manejadores de señales de Python se llaman de forma asíncrona en lo que respecta al usuario de Python, solo pueden ocurrir entre las instrucciones “atómicas” del intérprete de Python. Esto significa que las señales que llegan durante los cálculos largos implementados puramente en C (como coincidencias de expresiones regulares en grandes cuerpos de texto) pueden retrasarse por un tiempo arbitrario.

En este caso, las señales en Python se posponen hasta que la GIL esté libre .

De vuelta a tu pregunta. No , siempre que utilice funciones de reingreso dentro de la función de procesamiento de señales. Si el registro se usa solo en hilos, no habrá problemas.

El GIL (Global Interpreter Lock) impide que cualquier código de Python se ejecute al mismo tiempo, por lo que técnicamente el hilo principal no puede procesar una señal mientras que otros hilos se están ejecutando. Puede “aparecer” de esa manera, pero hay un gran mutex que solo permite que se ejecute un hilo de python a la vez.

Lo mejor que puedo adivinar, el problema con las señales y los hilos es que una señal normalmente es causada por una interrupción que puede ocurrir en cualquier momento. Así que me imagino que Python detiene lo que está haciendo y llama al controlador. En este punto, es posible que ya se haya adquirido un locking y, por lo tanto, si el registro intenta bloquearlo nuevamente, se produce un interlocking. En algunas implementaciones, esto funciona bien porque el mutex se puede bloquear varias veces (reingresar) pero en otras solo hay un locking.

Esperemos que alguien más pueda respaldar esto.