Глобальная блокировка интерпретатора (, GIL) — способ синхронизации потоков, который используется в некоторых интерпретируемых языках программирования, например в Python и Ruby.

Суть концепции GIL является самым простым способом избежать конфликтов при одновременном обращении разных потоков к одним и тем же участкам памяти. Когда один поток захватывает его, GIL, работая по принципу мьютекса, блокирует остальные. Нет параллельных потоков — нет конфликтов при обращении к разделяемым объектам. Очерёдность выполнения потоков определяет интерпретатор в зависимости от реализации, переключение между потоками может происходить: когда активный поток пытается осуществить ввод-вывод, по исчерпании лимита выполненных инструкций, либо по таймеру.

Преимущества и недостатки Главный недостаток подхода обеспечения потокобезопасности при помощи GIL — это ограничение параллельности вычислений. GIL не позволяет достигать наибольшей эффективности вычислений при работе на многоядерных и мультипроцессорных системах, так как может работать только один поток. Также использование нескольких потоков накладывает издержки на их переключение из-за эффекта конкуренции (потоки «пытаются» перехватить GIL). То есть многопоточное выполнение может занять большее время, чем последовательное выполнение тех же задач.

Причины использования GIL: Однопоточные сценарии выполняются значительно быстрее, чем при использовании других подходов обеспечения потокобезопасности; Простая интеграция библиотек на C, которые зачастую тоже не потокобезопасны; Простота реализации.

Применение GIL используется в CPython'е, наиболее распространённой реализации интерпретатора языка Python, и в Ruby MRI, эталонной реализации интерпретатора языка Ruby, где он зовётся Global VM Lock.

Реализации интерпретаторов на JVM (Jython, JRuby) и на .NET (IronPython, IronRuby) не используют GIL.

В рамках проекта PyPy ведётся работа по реализации транзакционной памяти (). На данный момент даже в многопоточных вычислениях интерпретатор с STM работает во много раз медленней, чем с GIL. Но за счёт JIT PyPy-STM PyPy-STM on Bitbucket всё равно быстрее, чем CPython.

PEP 703 В сети ни раз появлялись петиции и открытые письма с просьбой убрать GIL из Python'а. Однако создатель и «великодушный пожизненный диктатор» проекта Гвидо ван Россум заявлял, что GIL не так уж и плох, и он будет в CPython'е до тех пор, пока кто-то другой не представит реализацию Python'а без GIL, с которой бы однопоточные скрипты работали так же быстро.

В 2023 году Управляющим советом было принято предложение PEP 703, которое описывает отказ от GIL в CPython. Для реализации отказа потребуется глубокая переработка управления ссылками и памятью, сборки мусора и других аспектов интерпретатора. Запланировано постепенное раскатывание изменений с возможностью частичной или полной отмены инициативы в случае проблем. Целевой релиз для реализации версии без GIL - 3.13, однако существуют предварительные варианты на основе Python 3.9.10 и 3.12.

Примечания

Категория:Python Категория:Ruby Категория:Управление конкурентными потоками