WikiDer > Глобальная блокировка интерпретатора
А глобальная блокировка интерпретатора (GIL) - это механизм, используемый в компьютерном языке переводчики синхронизировать выполнение потоки так что одновременно может выполняться только один собственный поток.[1] Интерпретатор, использующий GIL, всегда позволяет выполнять только один поток за раз, даже если он выполняется на многоядерный процессор. Некоторые популярные интерпретаторы с GIL: CPython и Рубиновый МРТ.
Базовые технические концепции
Глобальная блокировка интерпретатора (GIL) - это взаимное исключение замок проводится язык программирования устный переводчик нить чтобы избежать разглашения кода, который не потокобезопасный с другими потоками. В реализациях с GIL всегда есть один GIL для каждого интерпретатора. процесс.
Приложения, работающие на реализациях с GIL, могут быть спроектированы так, чтобы использовать отдельные процессы для достижения полного параллелизма, поскольку каждый процесс имеет свой собственный интерпретатор и, в свою очередь, свой собственный GIL. В противном случае GIL может стать серьезным препятствием для параллелизма.
Недостатки
Использование глобальной блокировки интерпретатора в языке эффективно ограничивает количество параллелизм достижимый через параллелизм одного процесса интерпретатора с несколькими потоками. Если процесс почти полностью состоит из интерпретируемого кода и не выполняет вызовов за пределами интерпретатора, которые блокируются в течение длительных периодов времени (позволяя GIL освобождаться этим потоком во время обработки), вероятно, будет очень небольшое увеличение по скорости при запуске процесса на мультипроцессор машина. Из-за сигнализации с потоком, привязанным к ЦП, это может вызвать значительное замедление даже на отдельных процессорах.[2]
Преимущества
Причины использования глобальной блокировки интерпретатора включают:
- повышенная скорость работы однопоточных программ (нет необходимости устанавливать или снимать блокировки для всех структур данных по отдельности),
- легкая интеграция C библиотеки, которые обычно не являются потокобезопасными,
- простота реализации (один GIL реализовать намного проще, чем интерпретатор без блокировок или интерпретатор с мелкими блокировками).
Способ обойти GIL - создать отдельный интерпретатор для каждого потока, что слишком дорого для большинства языков.
Примеры
Некоторые языковые реализации, реализующие глобальную блокировку интерпретатора: CPython, наиболее широко используемая реализация Python,[3][4] и Рубиновый МРТ, то эталонная реализация из Рубин (где это называется Global VM Lock).
JVMэквиваленты этих языков (Jython и JRuby) не используют глобальные блокировки интерпретатора. IronPython и IronRuby реализуются поверх Microsoftс Среда выполнения динамического языка а также избегайте использования GIL.[5]
Примером интерпретируемого языка, не страдающего от GIL, является Tcl, который используется в инструменте тестирования производительности HammerDB.[6]
Смотрите также
Рекомендации
- ^ "GlobalInterpreterLock". Получено 30 ноября 2015.
- ^ Дэвид Бизли (2009-06-11). "Внутри Python GIL" (PDF). Чикаго: Чикагская группа пользователей Python. Получено 2009-10-07.
- ^ Шеннон -jj Беренс (03.02.2008). «Параллелизм и Python». Журнал доктора Добба. п. 2. Получено 2008-07-12.
GIL - это блокировка, которая используется для защиты всех критических разделов в Python. Следовательно, даже если у вас несколько процессоров, только один поток может одновременно выполнять «питонические» вещи.
- ^ «Справочное руководство по API Python / C: состояние потока и глобальная блокировка интерпретатора». Архивировано из оригинал на 2008-09-14. Получено 2014-08-15.
- ^ "IronPython на python.org". python.org. Получено 2011-04-04.
IronPython не имеет GIL, а многопоточный код может использовать многоядерные процессоры.
- ^ «Концепции и архитектура HammerDB». HammerDB. 2018-11-30. Получено 2020-05-10.
С самого начала важно понимать, что HammerDB написан на TCL из-за уникальных возможностей многопоточности, которые предоставляет TCL.