Глобальная блокировка интерпретатора

(перенаправлено с «Global Interpreter Lock»)

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

Схематичное изображение работы потоков под GIL. Зелёный — поток, удерживающий GIL, красные — блокированные потоки

Суть концепции править

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

Преимущества и недостатки править

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

Причины использования GIL:

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

Применение править

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].

Примечания править

  1. Thread State and the Global Interpreter Lock. Дата обращения: 21 декабря 2013. Архивировано 24 декабря 2013 года.
  2. Antoine Pitrou. Reworking the GIL. Python Mailing Lists (25 октября 2009). Дата обращения: 21 декабря 2013. Архивировано 10 июня 2011 года.
  3. Описание GIL. Python Wiki. Дата обращения: 21 декабря 2013. Архивировано 24 декабря 2013 года.
  4. David Beazley. Inside the Python GIL. Chicago: Chicago Python User Group (11 июня 2009). Дата обращения: 7 октября 2009. Архивировано 24 декабря 2010 года.
  5. Shannon -jj Behrens. Concurrency and Python 2. Dr. Dobb's Journal (3 февраля 2008). Дата обращения: 12 июля 2008. Архивировано 26 июня 2008 года.
  6. WhyJython. Python Wiki. Дата обращения: 21 декабря 2013. Архивировано 22 декабря 2013 года.
  7. IronPython. Python Wiki. Дата обращения: 4 апреля 2011. Архивировано 12 июня 2011 года.
  8. [1]Архивная копия от 24 декабря 2013 на Wayback Machine PyPy-STM on Bitbucket
  9. Update on STM. Python Wiki (16 октября 2013). Дата обращения: 21 декабря 2013. Архивировано 24 декабря 2013 года.
  10. An open letter to Guido van Rossum: Mr Rossum, tear down that GIL! SnapLogic (9 сентября 2007). Архивировано из оригинала 24 декабря 2013 года.
  11. Guido van Rossum. the future of the GIL. Python Mailing Lists (8 мая 2007). Дата обращения: 21 декабря 2013. Архивировано 9 ноября 2020 года.
  12. Guido van Rossum. It isn't Easy to Remove the GIL. artima.com (10 сентября 2007). Дата обращения: 21 декабря 2013. Архивировано 6 июня 2019 года.
  13. PEP 703 – Making the Global Interpreter Lock Optional in CPython | peps.python.org (англ.). peps.python.org. Дата обращения: 9 октября 2023. Архивировано 13 октября 2023 года.
  14. GIL в Python: как его будут отключать. Хабр (20 марта 2024). Дата обращения: 12 апреля 2024.
  15. Sam Gross. colesbury/nogil. — 2024-04-11.
  16. Sam Gross. colesbury/nogil-3.12. — 2024-04-03.