¿Cómo afecta el bloqueo global del intérprete al rendimiento en aplicaciones Python de subprocesos múltiples?

Para complementar la respuesta de Adam:

  • Python GIL es un artefacto de la implementación * CPython *. Otras implementaciones (f.ex Jython) no necesariamente sufren las limitaciones de GIL.
  • Los hilos en Python son hilos POSIX reales, y se distribuirán en múltiples procesadores / núcleos. Sin embargo, * nunca * se ejecutarán simultáneamente. Se ejecutará un hilo de Python si y solo si no se están ejecutando otros hilos.
  • Para evitar esto, la forma recomendada es usar el módulo de multiprocesamiento, que genera procesos en lugar de hilos: http://docs.python.org/library/m…
  • Sin embargo, los procesos (que utiliza el módulo de multiprocesamiento) son más pesados ​​que los subprocesos. La regla es: los hilos colaboran, los procesos compiten. Es importante tener en cuenta este éxito de rendimiento.

En términos simples, GIL permite que solo se ejecute un hilo en cualquier momento. Puede estar utilizando subprocesos múltiples y puede tener subprocesos ejecutándose en diferentes procesadores. Pero debido a GIL, solo un hilo puede ejecutarse en cualquier momento. Entonces, durante algún tiempo instantáneo, se ejecutará el subproceso del primer procesador y, en el próximo instante, se ejecutará el subproceso de otro procesador. Por lo tanto, puede ver que la verdadera concurrencia nunca se logra debido a GIL

David Beazley hizo una presentación sobre esto hace un tiempo. Aquí están las diapositivas: http://www.dabeaz.com/python/Und