Разбираемся в Python GIL

27 Мар 2020 , 323

В этой статье мы разберем , что такое GIL. Для чего его реализовали в Python и какие проблемы он решает и какие проблемы он создает и почему его не убирают из Python. Нужно отметить тот факт, что GIL используется в наиболее распространенной реализации интепретатора Python , а именно в CPython

GIL (Global Interpreter Lock – глобальная блокировка интерпретатора) - это булево значение в интерпритаторе Python(CPython), защищенное мьютексом.Это своеобразная блокировка , которая позволяет только одному потоку управлять интерпретатором Python. Получается, что в любой момент времени выполняется только один поток. И тем самым в Python не могут выполняться параллельно несколько потоков из-за это ограничения.

Причины , по которым в Python используется GIL

Так почему же используется это блокировка , которая не позволяет нескольким потокам выполняться параллельно ? Ведь таким образом мы не можем писать на Python(CPython) высокопроизводительные многопоточные программы.

Чтобы ответить на этот вопрос нам нужно понять как работает сборщик мусора в CPython

В отличие от С и других языков программирования Python управляет объектами с помощью подсчета ссылок. Диспетчер в памяти отслеживает количество ссылок на каждый объект в программе и когда количество ссылок на данный объект достигает нуля , то сборщик мусора удаляет этот объект, тем самым освобождая память. Это все делается самим интерпретатором Python , освобождая программиста от всех хлопот связанных с управления памятью.

Счетчик ссылок увеличивается , если объекту присваивается новое имя или этот объект помещается в словарь или в кортеж , но также , счетчик ссылок уменьшается, когда ссылка на объект переназначается, когда ссылка на объект выходит из области видимости. И как мы отмечали выше , когда счетчик ссылок для объекта становится равным нулю, то сборщик мусора освобождает память выделенный под этот объект.

Все это прекрасно работает , если программа на Python работает в однопоточном режиме. А вот когда программа запускается в многопоточном режиме и если не используется GIL , то возникают проблемы с преждевременным удалением объектов и другими проблемами связанными с управлением памяти. Это происходит из-за того, что несколько потоков одновременно могут увеличивать или уменьшать значения счётчика ссылок на объект.

Поэтому для решения этих проблем в Python(CPython) был добавлен GIL. GIL легко было реализовать и интегрировать в Python. Реализация GIL увеличил производительность однопоточных приложений, поскольку управление велось только одним блокиратором. И еще это архитектурное решение на заре развития Python привел к тому , что очень многие библиотеки написанные на Си были интегрированны для Python , которые повлияли на его популярность. Ведь разработчикам , которым важна была скорость разработки , важно было наличие готовых библиотек, а не скорость работы программ в многопоточных приложениях.

Но времена меняются и технический прогресс не стоит на месте и то архитектурное решение , которое вначале сделало Python таким популярным, стал объектом других проблем, связанных с реализацией многопточных приложений

comments powered by Disqus

Подписка

Подпишитесь на наш список рассылки, чтобы получать обновления из блога

Рубрики

Теги