Глобальная блокировка интерпретатора ( GIL ) — это механизм, используемый в интерпретаторах компьютерных языков для синхронизации выполнения потоков , чтобы только один собственный поток (на процесс) мог выполнять основные операции (такие как выделение памяти и подсчет ссылок ) одновременно. [1] Как правило, интерпретатор, использующий GIL, будет видеть только один поток для выполнения одновременно, даже если он работает на многоядерном процессоре , хотя некоторые реализации предусматривают интенсивный код ЦП для освобождения GIL, позволяя нескольким потокам использовать несколько ядер. Некоторые популярные интерпретаторы, которые имеют GIL, — это CPython и Ruby MRI .
Глобальная блокировка интерпретатора (GIL) — это блокировка взаимного исключения, удерживаемая потоком интерпретатора языка программирования , чтобы избежать совместного использования кода, который не является потокобезопасным, с другими потоками. В реализациях с GIL всегда есть один GIL для каждого процесса интерпретатора .
Приложения, работающие на реализациях с GIL, могут быть спроектированы для использования отдельных процессов для достижения полного параллелизма, поскольку каждый процесс имеет свой собственный интерпретатор и, в свою очередь, свой собственный GIL. В противном случае GIL может стать существенным препятствием для параллелизма.
Причины использования глобальной блокировки интерпретатора включают:
Способом обойти GIL является создание отдельного интерпретатора для каждого потока, что слишком затратно для большинства языков. [ необходима цитата ]
Использование глобальной блокировки интерпретатора в языке эффективно ограничивает объем параллелизма, достижимого посредством параллелизма одного процесса интерпретатора с несколькими потоками. Если процесс почти полностью состоит из интерпретируемого кода и не делает вызовов за пределами интерпретатора, которые блокируются на длительные периоды времени (позволяя этому потоку освобождать GIL во время обработки), то, скорее всего, при запуске процесса на многопроцессорной машине будет очень мало увеличения скорости . Из-за сигнализации с потоком, привязанным к ЦП, это может вызвать значительное замедление, даже на отдельных процессорах. [2] Что еще серьезнее, когда один собственный поток вызывает блокирующий процесс ОС (например, доступ к диску), весь процесс блокируется, даже если другие потоки приложения могут ожидать.
Некоторые реализации языка, реализующие глобальную блокировку интерпретатора, — это CPython , наиболее широко используемая реализация Python , [3] [ 4] и Ruby MRI , эталонная реализация Ruby (где она называется Global VM Lock).
Эквиваленты этих языков на основе JVM ( Jython и JRuby ) не используют глобальные блокировки интерпретатора. IronPython и IronRuby реализованы поверх Dynamic Language Runtime от Microsoft и также избегают использования GIL. [5]
Примером интерпретируемого языка без GIL является Tcl , который используется в инструменте бенчмаркинга HammerDB . [6]
GIL - это блокировка, которая используется для защиты всех критических секций в Python. Следовательно, даже если у вас несколько ЦП, только один поток может выполнять "питоновские" вещи в один момент времени.
IronPython не имеет GIL, а многопоточный код может использовать многоядерные процессоры.
Важно понимать с самого начала, что HammerDB написан на TCL из-за уникальных возможностей потоковой обработки, которые предоставляет TCL.