Глобальная блокировка интерпретатора (англ. Global Interpreter Lock, GIL) — способ синхронизации потоков, который используется в некоторых интерпретируемых языках программирования, например в Python и Ruby.
Суть концепции
правитьGIL является самым простым способом избежать конфликтов при одновременном обращении разных потоков к одним и тем же участкам памяти[1]. Когда один поток захватывает его, GIL, работая по принципу мьютекса, блокирует остальные. Нет параллельных потоков — нет конфликтов при обращении к разделяемым объектам. Очерёдность выполнения потоков определяет интерпретатор в зависимости от реализации, переключение между потоками может происходить: когда активный поток пытается осуществить ввод-вывод, по исчерпании лимита выполненных инструкций, либо по таймеру[2].
Преимущества и недостатки
правитьГлавный недостаток подхода обеспечения потокобезопасности при помощи GIL — это ограничение параллельности вычислений. GIL не позволяет достигать наибольшей эффективности вычислений при работе на многоядерных и мультипроцессорных системах, так как может работать только один поток[3]. Также использование нескольких потоков накладывает издержки на их переключение из-за эффекта конкуренции (потоки «пытаются» перехватить GIL). То есть многопоточное выполнение может занять большее время, чем последовательное выполнение тех же задач[4].
Причины использования GIL:
Применение
правитьGIL используется в CPython'е, наиболее распространённой реализации интерпретатора языка Python[5], и в Ruby MRI, эталонной реализации интерпретатора языка Ruby, где он зовётся Global VM Lock.
Реализации интерпретаторов на JVM (Jython, JRuby) и на .NET (IronPython, IronRuby) не используют GIL[6][7].
В рамках проекта PyPy ведётся работа по реализации транзакционной памяти (англ. Software Transactional Memory, SТМ). На данный момент[какой?] даже в многопоточных вычислениях интерпретатор с STM работает во много раз медленней, чем с GIL. Но за счёт JIT PyPy-STM[8] всё равно быстрее, чем CPython[9].
PEP 703
правитьВ сети не раз появлялись петиции и открытые письма с просьбой убрать GIL из Python'а[10]. Однако создатель и «великодушный пожизненный диктатор» проекта Гвидо ван Россум заявлял, что GIL не так уж и плох, и он будет в CPython'е до тех пор, пока кто-то другой не представит реализацию Python'а без GIL, с которой бы однопоточные скрипты работали так же быстро[11][12].
В 2023 году Управляющим советом было принято предложение PEP 703, которое описывает отказ от GIL в CPython[13]. Для реализации отказа потребуется глубокая переработка управления ссылками и памятью, сборки мусора и других аспектов интерпретатора[14]. Запланировано постепенное раскатывание изменений с возможностью частичной или полной отмены инициативы в случае проблем. Целевой релиз для реализации версии без GIL - 3.13, однако существуют предварительные варианты на основе Python 3.9.10[15] и 3.12[16].
Примечания
править- ↑ Thread State and the Global Interpreter Lock . Дата обращения: 21 декабря 2013. Архивировано 24 декабря 2013 года.
- ↑ Antoine Pitrou. Reworking the GIL . Python Mailing Lists (25 октября 2009). Дата обращения: 21 декабря 2013. Архивировано 10 июня 2011 года.
- ↑ Описание GIL . Python Wiki. Дата обращения: 21 декабря 2013. Архивировано 24 декабря 2013 года.
- ↑ David Beazley. Inside the Python GIL . Chicago: Chicago Python User Group (11 июня 2009). Дата обращения: 7 октября 2009. Архивировано 24 декабря 2010 года.
- ↑ Shannon -jj Behrens. Concurrency and Python 2. Dr. Dobb's Journal (3 февраля 2008). Дата обращения: 12 июля 2008. Архивировано 26 июня 2008 года.
- ↑ WhyJython . Python Wiki. Дата обращения: 21 декабря 2013. Архивировано 22 декабря 2013 года.
- ↑ IronPython . Python Wiki. Дата обращения: 4 апреля 2011. Архивировано 12 июня 2011 года.
- ↑ [1]Архивная копия от 24 декабря 2013 на Wayback Machine PyPy-STM on Bitbucket
- ↑ Update on STM . Python Wiki (16 октября 2013). Дата обращения: 21 декабря 2013. Архивировано 24 декабря 2013 года.
- ↑ An open letter to Guido van Rossum: Mr Rossum, tear down that GIL! SnapLogic (9 сентября 2007). Архивировано из оригинала 24 декабря 2013 года.
- ↑ Guido van Rossum. the future of the GIL . Python Mailing Lists (8 мая 2007). Дата обращения: 21 декабря 2013. Архивировано 9 ноября 2020 года.
- ↑ Guido van Rossum. It isn't Easy to Remove the GIL . artima.com (10 сентября 2007). Дата обращения: 21 декабря 2013. Архивировано 6 июня 2019 года.
- ↑ PEP 703 – Making the Global Interpreter Lock Optional in CPython | peps.python.org (англ.). peps.python.org. Дата обращения: 9 октября 2023. Архивировано 13 октября 2023 года.
- ↑ GIL в Python: как его будут отключать . Хабр (20 марта 2024). Дата обращения: 12 апреля 2024.
- ↑ Sam Gross. colesbury/nogil. — 2024-04-11.
- ↑ Sam Gross. colesbury/nogil-3.12. — 2024-04-03.