¿Cómo puedo verificar si un hilo contiene actualmente la GIL?

Intenté encontrar una función que me diga si el subproceso actual tiene el locking global del intérprete o no.

La documentación de Python / C-API no parece contener tal función.

Mi solución actual es simplemente adquirir el locking utilizando PyGILState_Ensure() antes de liberarlo utilizando PyEval_SaveThread para no intentar liberar un locking que no fue adquirido por el hilo actual.

(por cierto. ¿Qué significa “emite un error fatal”?)

Antecedentes de esta pregunta: Tengo una aplicación multiproceso que incrusta Python. Si un subproceso se cierra sin liberar el locking (lo que podría ocurrir debido a lockings), otros subprocesos ya no pueden ejecutarse. Por lo tanto, al limpiar / cerrar el hilo, me gustaría verificar si el locking está sujeto a este hilo y liberarlo en este caso.

¡Gracias por adelantado por las respuestas!

Si está usando (o puede usar) Python 3.4, hay una nueva función para el mismo propósito:

 if (PyGILState_Check()) { /* I have the GIL */ } 

https://docs.python.org/3/c-api/init.html?highlight=pygilstate_check#c.PyGILState_Check

Devuelve 1 si el hilo actual mantiene la GIL y 0 de lo contrario. Esta función puede ser llamada desde cualquier hilo en cualquier momento. Solo si se ha inicializado su estado de subproceso de Python y actualmente mantiene la GIL, devolverá 1. Esta es principalmente una función auxiliar / de diagnóstico. Puede ser útil, por ejemplo, en contextos de callback o funciones de asignación de memoria cuando saber que la GIL está bloqueada puede permitir que la persona que realiza la llamada realice acciones sensibles o se comporte de otra manera.

En Python 2, puedes probar algo como lo siguiente:

 int PyGILState_Check2(void) { PyThreadState * tstate = _PyThreadState_Current; return tstate && (tstate == PyGILState_GetThisThreadState()); } 

Parece funcionar bien en los casos que he intentado. https://github.com/pankajp/pygilstate_check/blob/master/_pygilstate_check.c#L9

No sé lo que estás buscando … pero solo debes considerar el uso de ambas macros, Py_BEGIN_ALLOW_THREADS y Py_END_ALLOW_THREADS , con estas macros puedes asegurarte de que el código entre ellos no tenga el GIL bloqueado y lockings aleatorios dentro de ellos. estaremos seguros