GIL en Python 3.1

¿Alguien sabe el destino del locking global de intérpretes en Python 3.1 contra la integración de subprocesamiento múltiple de C ++?

GIL todavía está allí en CPython 3.1; el objective de los proyectos Unladen Swallow (entre muchos otros aumentos de rendimiento) es eliminarlo, pero sigue siendo una forma de alcanzar sus objectives, y está trabajando en 2.6 primero con la intención de eventualmente portar a 3.x para cualquier X que sea actual por el Se considera que la versión 2.y está terminada. Por ahora, el multiprocesamiento (en lugar de subprocesamiento) sigue siendo la opción para usar múltiples núcleos en CPython (IronPython y Jython también están bien, pero no admiten Python 3 actualmente, ni tampoco hacen que la integración con C ++ sea tan fácil; ).

Se producirán cambios significativos en la GIL para Python 3.2. Eche un vistazo a las novedades de Python 3.2 y el hilo que lo inició en la lista de correo .

Si bien los cambios no significan el final de la GIL, anuncian un aumento de rendimiento potencialmente enorme.

Actualización0

  • Las mejoras en el rendimiento general con el nuevo GIL en 3.2 por Antoine Pitrou fueron insignificantes, y en su lugar se centraron en mejorar los problemas de contención que surgen en ciertos casos de esquina.
  • Se hizo un esfuerzo admirable por parte de David Beazley para implementar un progtwigdor para mejorar significativamente el rendimiento cuando se mezclan los subprocesos de CPU y IO enlazados, que desafortunadamente se derribó.
  • Se propuso el trabajo de Unladen Swallow para fusionarse en Python 3.3, pero se ha retirado debido a la falta de resultados en ese proyecto. PyPy es ahora el proyecto preferido y actualmente está solicitando fondos para agregar el soporte de Python3k. Hay muy pocas posibilidades de que PyPy se convierta en el predeterminado por el momento.

Se han realizado esfuerzos durante los últimos 15 años para eliminar la GIL de CPython, pero en el futuro previsible está aquí para quedarse.

La GIL no afectará tu código que no usa objetos de python. En Numpy, lanzamos la GIL para el código computacional (llamadas de álgebra lineal, etc …), y el código subyacente puede usar multihilo libremente (de hecho, generalmente son bibliotecas de terceros que no saben nada acerca de python)

El GIL es algo bueno.

Simplemente haga que su aplicación C ++ libere GIL mientras realiza su trabajo de multiproceso. El código de Python continuará ejecutándose en los otros subprocesos, sin estropear. Solo adquiere la GIL cuando tengas que tocar objetos python.

Supongo que siempre habrá un GIL. La razón es el rendimiento. Hacer que todos los subprocesos de acceso de bajo nivel sean seguros: significa poner un mutex alrededor de cada operación de hash, etc. Recuerda que una simple statement como

self.foo(self.bar, 3, val) 

Puede que ya tenga al menos 3 (si val es una búsqueda de tabla hash global) en este momento e incluso mucho más si el caché del método no está activo (dependiendo de la profundidad de la herencia de la clase)

Es costoso, por eso Java abandonó la idea e introdujo tablas hash que no usan una llamada de monitor para deshacerse de su marca registrada “Java Is Slow”.

Según tengo entendido, el progtwigdor “brainfuck” reemplazará a GIL de python 3.2

BFS bainfuck planificador

Si la GIL se está interponiendo, simplemente use el módulo de multiprocesamiento . Genera nuevos procesos, pero utiliza el modelo de subprocesamiento y (la mayoría de) la API. En otras palabras, puede hacer un paralelismo basado en procesos de forma similar a un hilo.