? Si usted ha estado trabajando con Python y quiere empezar a experimentar con las técnicas de programación más avanzadas , el aprendizaje sobre bloqueo intérprete global ( GIL ) es una buena idea. GIL es un algoritmo que se encarga de la ejecución de varios subprocesos en un programa Python. GIL es un requisito cuando se está trabajando con varios temas , porque la gestión de memoria de CPython no es seguro para subprocesos . Además , el GIL ha sido conocido para degradar un rendimiento de programas . Un ejemplo es que puede tomar más tiempo para dos temas que llamar a la misma función de un subproceso llama a la función dos veces. Usando GIL
En un programa multi-hilo Python un hilo no puede acceder de forma segura objetos de Python a menos que el GIL está en manos del subproceso actual . El GIL se asegura de que ambos temas están actualizando correctamente las referencias de objeto que se llama. Para empezar a utilizar el GIL necesita guardar el estado hilo en una variable de ubicación y liberar el bloqueo intérprete global. En este punto se puede realizar la operación de bloqueo de entrada /salida y volver a adquirir el bloqueo intérprete mundial cuando es completa . Por último , restaurar el estado de rosca de la variable local. Usted puede utilizar el siguiente ejemplo de macro para simplificar el proceso :
Py_BEGIN_ALLOW_THREADS ... Haga un poco de bloqueo de operación de E /S ... Py_END_ALLOW_THREADS
Calling Python Code
menudo temas son creados a partir de otros lenguajes de programación como C y si necesita llamar a múltiples hilos , entonces usted necesita utilizar GIL . Primero debe registrar estos temas con un intérprete a través de una estructura de datos de estado de la hebra y luego adquirir el GIL . Para simplificar este proceso, puede utilizar las funciones de " PyGILState_Release () " " PyGILState_Ensure ()" y . El siguiente es un ejemplo de cómo aplicar este concepto:
PyGILState_STATE GSTATE ; GSTATE = PyGILState_Ensure () ;/* Realizar acciones Python aquí . * /resultado = CallSomeFunction () ;/* Evaluar resultado o manejar excepción * //* Suelte el hilo. No API Python permite más allá de este punto . * /PyGILState_Release ( GSTATE ) ;
Python Temas
Python un hilo es un hilo del sistema real como cualquier otra ejecución del programa. Cuando se ejecuta un hilo Python crea una estructura de datos pequeña con el estado intérprete. Después de esto un nuevo hilo se inicia y se llama el " PyEval_CallObject . " El último paso es una función de C simple que se ejecuta Python lo especifican . El GIL controla cuidadosamente la ejecución de cada hilo. El siguiente es un ejemplo de un hilo Python :
importación timeimport threadingclass CountdownThread ( threading.Thread ) : def __ init__ (self, count) : threading.Thread.__init__ (auto ) self.count = countdef plazo (auto- ) : mientras self.count > 0 : print " Cuenta atrás " , self.countself.count - = 1time.sleep ( 5 ) retorno
GIL Problemas y sustitución
desarrolladores Python han discutido la eliminación del GIL , pero se han topado con algunos problemas . Un problema que a menudo se menciona con GIL es que se evita que los programas CPython multiproceso de aprovechar al máximo los procesadores multi -core. Cualquier sustitución GIL debe ser simple y concurrentes cuando se trabaja con hilos . Debe ser más rápido que GIL y debe tener una buena compatibilidad API . Un ejemplo de la compatibilidad API es tener una buena localización al enumerar los objetos que apunta.