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

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

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

Суть концепции

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

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

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

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

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

Применение

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 .

Примечания

  1. . Дата обращения: 21 декабря 2013. 24 декабря 2013 года.
  2. Antoine Pitrou. . (25 октября 2009). Дата обращения: 21 декабря 2013. 10 июня 2011 года.
  3. . . Дата обращения: 21 декабря 2013. 24 декабря 2013 года.
  4. David Beazley. . Chicago: (11 июня 2009). Дата обращения: 7 октября 2009. 24 декабря 2010 года.
  5. Shannon -jj Behrens. 2. Dr. Dobb's Journal (3 февраля 2008). Дата обращения: 12 июля 2008. 26 июня 2008 года.
  6. (9 сентября 2007). Архивировано из 24 декабря 2013 года.
  7. Guido van Rossum . . (8 мая 2007). Дата обращения: 21 декабря 2013. 9 ноября 2020 года.
  8. Guido van Rossum. . (10 сентября 2007). Дата обращения: 21 декабря 2013. 6 июня 2019 года.
  9. (англ.) . peps.python.org . Дата обращения: 9 октября 2023.
  10. . Python Wiki. Дата обращения: 21 декабря 2013. 22 декабря 2013 года.
  11. . Python Wiki. Дата обращения: 4 апреля 2011. 12 июня 2011 года.
  12. от 24 декабря 2013 на Wayback Machine PyPy-STM on Bitbucket
  13. . Python Wiki (16 октября 2013). Дата обращения: 21 декабря 2013. 24 декабря 2013 года.
Источник —

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