Используйте для вопросов, касающихся глобальной блокировки интерпретатора CPython

Глобальная блокировка интерпретатора (GIL) - это деталь реализации CPython, которая обеспечивает безопасность потоков, запрещая одновременное выполнение кода Python. Версии Python, такие как CPython (эталонная реализация Python), Stackless Python и PyPy, имеют GIL; такие версии, как Jython и IronPython, этого не делают.

Глобальная блокировка интерпретатора Python (GIL) - это глобальный мьютекс, который гарантирует, что только один поток интерпретатора может запускать байт-код Python одновременно. Это базовый механизм, который позволяет CPython в целом быть потокобезопасным, несмотря на то, что части интерпретатора, такие как сборка мусора, не являются потокобезопасными. В то время как GIL предотвращает параллельное выполнение кода Python по потокам, код, который ожидает ввода-вывода, такой как вызовы файловой системы или базы данных, и код, который выполняет длительный перебор чисел в C (например, функции NumPy), освобождает GIL, чтобы позволить другим потокам выполняться.

Версии Python, которые работают на виртуальных машинах, таких как Jython и IronPython, не имеют GIL, в первую очередь потому, что они могут полагаться на виртуальную машину, чтобы обеспечить полностью поточно-безопасную сборку мусора без подсчета ссылок.

GIL стал предметом некоторых споров по мере развития Python, потому что он ограничивает производительность многопоточных программ даже на многопроцессорных платформах, которые в противном случае могут выполнять код параллельно.

Защитники GIL (в первую очередь GvR, первоначальный создатель Python) утверждают, что GIL упрощает написание расширений Python (потому что они могут с уверенностью предполагать, что работают только они), и что удаление GIL потребует более детализированных мьютексов. это повлияет на однопоточную производительность. В Python Wiki есть более подробная информация о проблемах с удалением GIL.

Различные проекты были направлены на удаление GIL, в том числе:

  • Форк Python 1999 года, который умер из-за плохой однопоточной производительности.
  • Незагруженная ласточка
  • Экспериментальный проект PyPy по замене GIL на транзакционную память

Использование Python на нескольких ядрах по-прежнему возможно с использованием нескольких процессов (например, с модулем многопроцессорности), но связь между несколькими процессами сложнее, чем связь между несколькими потоками в одном процессе. Кроме того, порождение процесса использует больше процессорного времени и памяти, чем порождение потока.


Дополнительная информация о GIL: