Спин-блокировка
- 1 year ago
- 0
- 0
Глобальная блокировка интерпретатора ( англ. Global Interpreter Lock , GIL ) — способ синхронизации потоков , который используется в некоторых интерпретируемых языках программирования , например в Python и Ruby .
GIL является самым простым способом избежать конфликтов при одновременном обращении разных потоков к одним и тем же участкам памяти . Когда один поток захватывает его, GIL, работая по принципу мьютекса , блокирует остальные. Нет параллельных потоков — нет конфликтов при обращении к разделяемым объектам. Очерёдность выполнения потоков определяет интерпретатор в зависимости от реализации, переключение между потоками может происходить: когда активный поток пытается осуществить ввод-вывод , по исчерпании лимита выполненных инструкций , либо по таймеру .
Главный недостаток подхода обеспечения потокобезопасности при помощи GIL — это ограничение параллельности вычислений . GIL не позволяет достигать наибольшей эффективности вычислений при работе на многоядерных и мультипроцессорных системах, так как может работать только один поток . Также использование нескольких потоков накладывает издержки на их переключение из-за эффекта конкуренции (потоки «пытаются» перехватить GIL). То есть многопоточное выполнение может занять большее время, чем последовательное выполнение тех же задач .
Причины использования GIL:
GIL используется в CPython 'е, наиболее распространённой реализации интерпретатора языка Python , и в , эталонной реализации интерпретатора языка Ruby , где он зовётся Global VM Lock .
В сети не раз появлялись петиции и открытые письма с просьбой убрать GIL из Python'а . Однако создатель и « великодушный пожизненный диктатор » проекта Гвидо ван Россум заявляет, что GIL не так уж и плох и он будет в CPython'е до тех пор, пока кто-то другой не представит реализацию Python'а без GIL, с которой бы однопоточные скрипты работали так же быстро . Есть черновик PEP 703, который описывает отказ от GIL в CPython
Реализации интерпретаторов на JVM ( Jython , JRuby ) и на .NET ( IronPython , IronRuby ) не используют GIL .
В рамках проекта PyPy ведётся работа по реализации транзакционной памяти ( англ. Software Transactional Memory, SТМ ). На данный момент [ какой? ] даже в многопоточных вычислениях интерпретатор с STM работает во много раз медленней, чем с GIL. Но за счёт JIT PyPy-STM всё равно быстрее, чем CPython .