Как стать автором
Обновить

Как устроен GIL в Python

Python *
Перевод
Почему после распараллеливания выполнение вашей программы может замедлиться вдвое?
Почему после создания потока перестает работать Ctrl-C?
Представляю вашему вниманию перевод статьи David Beazley «Inside the Python GIL». В ней рассматриваются некоторые тонкости работы потоков и обработки сигналов в Python.

GIL
Читать дальше →
Всего голосов 67: ↑65 и ↓2 +63
Просмотры 104K
Комментарии 24

Прими участие или стань спикером в Ciklum Web Субботнике!

Блог компании Ciklum
Еще не уехал в отпуск и скучаешь в Киеве? Приходи пообщаться с коллегами на Ciklum Web Saturday!

25 июня в нашем замечательном офисе мы собираем друзей и партнеров обсудить web-технологии (PHP, Pyton, Perl, RoR, Drupal, Symphony, Magento) в формате традиционных Ciklum Saturdays.

Интересные подробности под хабракатом
Всего голосов 10: ↑7 и ↓3 +4
Просмотры 1.5K
Комментарии 7

Python threading или GIL нам почти не помеха

Python *
Наверное всем, кто хоть раз интересовался Python, известно про GIL — его одновременно и сильное и слабое место.
Не мешая однопоточным скриптам работать, он ставит изрядные палки в колеса при многопоточной работе на CPU-bound задачах (когда потоки выполняются, а не висят попеременно в ожидании I/O и т.п.).
Подробности хорошо описаны в переводе двухгодичной давности. Побороть GIL в официальной сборке Python для настоящего распараллеливания потоков мы не можем, но можно пойти другим путем — запретить системе перебрасывать потоки Python между ядрами. В общем пост из серии, «если не нужно, но очень хочется» :)
Если вы знаете про processor/cpu affinity, пользовались ctypes и pywin32, то ничего нового не будет.
Читать дальше →
Всего голосов 31: ↑29 и ↓2 +27
Просмотры 23K
Комментарии 34

Учимся писать многопоточные и многопроцессные приложения на Python

Python *Программирование *
Recovery mode
Эта статья не для матёрых укротителей Python’а, для которых распутать этот клубок змей — детская забава, а скорее поверхностный обзор многопоточных возможностей для недавно подсевших на питон.

К сожалению по теме многопоточности в Python не так уж много материала на русском языке, а питонеры, которые ничего не слышали, например, про GIL, мне стали попадаться с завидной регулярностью. В этой статье я постараюсь описать самые основные возможности многопоточного питона, расскажу что же такое GIL и как с ним (или без него) жить и многое другое.
Читать дальше →
Всего голосов 94: ↑88 и ↓6 +82
Просмотры 361K
Комментарии 93

Использование Python в многопоточном приложении на C++ и настоящая многопоточность в Python

Python *Программирование *C++ *
Все более или менее знающие Python разработчики знают про такую жуткую вещь как GIL. Глобальный блокировщик всего процесса до тех пор пока Python выполняется в одном из потоков. Он даёт потоко-защищённость методами сравнимыми с садизмом, поскольку любая неявная блокировка в многопоточном приложении смерти подобна, всё что опиралось на параллельное выполнение, умирает в мучениях, раз за разом натыкаясь на блокировку GIL.
Известно что по сей день из-за этого скорбного факта программисты на C++ используют Python-обёртки по большей части лишь в однопоточных приложениях, а программисты на Python пытаются всех убедить, что им и так неплохо живётся.
Казалось бы, если поток порождён в C++, он не знает ни о каком GIL, используй Python без блокировок и радуйся. Радость разработчика однако закончится уже на втором потоке запросившем область глобальных переменных без блокировки.
Однако есть путь ведущий к светлому будущему!
Этот путь был изначально в таком языке как Perl, он же поддерживается в Си-API языка Python и я ума не приложу почему подобный механизм не включен в один из стандартных модулей Python! Способ по сути сводит использование различных под-интерпретаторов Python в разных потоках, причём используя свой GIL для каждого(!!!) без всякого шаманства и магии, просто последовательно вызвав несколько функций и стандартного набора Си-API языка Python!
Читать дальше →
Всего голосов 76: ↑72 и ↓4 +68
Просмотры 39K
Комментарии 50

Еще раз о многопоточности и Python

Python *
Как известно, в основной реализации Питона CPython (python.org) используется Global Interpreter Lock (GIL). Эта штука позволяет одновременно запускать только один питоновский поток — остальные обязаны ждать переключения GIL на них.

Коллега Qualab недавно опубликовал на Хабре бойкую статью, предлагая новаторский подход: создавть по субинтерпретатору Питона на поток операционной системы, получая возможность запускать все наши субинтерпретаторы параллельно. Т.е. GIL как бы уже и не мешает совсем.

Идея свежая, но имеет один существенный недостаток — она не работает…
Читать дальше →
Всего голосов 56: ↑56 и ↓0 +56
Просмотры 35K
Комментарии 18

Как работает GIL в Ruby. Часть 1

Ruby *Программирование *Параллельное программирование *
Перевод
Пять из четырех разработчиков признают, что многопоточное программирование понять непросто.

Большую часть времени, что я провел в Ruby-сообществе, печально известная GIL оставалась для меня темной лошадкой. В этой статье я расскажу о том, как наконец познакомился с GIL поближе.

Первое, что я услышал о GIL, никак не было связано с тем, как она работает или для чего нужна. Все, что я услышал — что GIL — это плохо, поскольку ограничивает параллелизм, или то, что это хорошо, потому что делает код потокобезопасным. Пришло время, я приноровился к многопоточному программированию и понял, что на самом деле все сложнее.

Я хотел знать, как работает GIL с технической точки зрения. На GIL нет ни спецификации, ни документации. По сути, это особенность MRI (Matz's Ruby Implementation). Команда разработчиков MRI ничего не говорит по поводу того, как GIL работает и что гарантирует.

Впрочем, я забегаю вперед.
Читать дальше →
Всего голосов 43: ↑42 и ↓1 +41
Просмотры 22K
Комментарии 38

Как работает GIL в Ruby. Часть 2

Ruby *Программирование *Параллельное программирование *
Перевод
В прошлый раз я предложил заглянуть в код MRI, чтобы разобраться с реализацией GIL и ответить на оставшиеся вопросы. Что мы сегодня и сделаем.

Черновая версия этой статьи изобиловала кусками кода на C, однако, из-за этого суть терялась в деталях. В финальной версии почти нет кода, а для любителей поковыряться в исходниках я оставил ссылки на функции, которые упоминал.

В предыдущей серии


После первой части остались два вопроса:

  1. Делает ли GIL array << nil атомарной операцией?
  2. Делает ли GIL код на Ruby потокобезопасным?

На первый вопрос можно ответив, взглянув на реализацию, поэтому начнем с него.
Читать дальше →
Всего голосов 24: ↑22 и ↓2 +20
Просмотры 10K
Комментарии 3

Python на Хабре

Python *Программирование *
Некоторое время назад, в силу определенных причин, мне пришла в голову мысль о том, чтобы начать изучать какой-нибудь новый язык программирования. В качестве альтернатив для этого начинания я определил два языка: Java и Python. После продолжительного метания между ними и сопутствующих нытья и долбежки головой о стену (у меня с новыми языками всегда так — сомнения, раздумья, проблема выбора и т.д.), я все-таки остановился на Python. Окей, выбор сделан. Что дальше? А дальше я стал искать материал для изучения…
Читать дальше →
Всего голосов 182: ↑162 и ↓20 +142
Просмотры 441K
Комментарии 65

Python Meetup: ноябрьская встреча

Блог компании Lesta Studio Python *Программирование *
Tutorial
image

В конце ноября в Минске прошла очередная встреча Python Meetup. Четыре интереснейших доклада на около-python-овские темы, авторитетные спикеры. Кстати, впервые к нам приехал спикер не из Беларуси — это был Андрей Власовских, опытный докладчик из компании JetBrains.

В ноябрьском митапе мы рассмотрели опциональную типизацию в Python, асинхронное распределенное выполнение задач, введение в GIL и новый GIL, а также использование gevent для эмуляции высокой нагрузки.
Видео всех докладов, как и ссылки на презентации, можно найти под катом.
Читать дальше →
Всего голосов 34: ↑30 и ↓4 +26
Просмотры 9K
Комментарии 2

Как работает GIL в Ruby. Часть 3. Делает ли GIL ваш код потоко-безопасным?

Ruby *Параллельное программирование *
Перевод


Переводы предыдущих двух частей:
Первая часть
Вторая часть

Это статья Jesse Storimer. Он выступает на семинаре Unix fu, онлайн классе для Ruby-разработчиков, которые хотят научиться удивительным хакам в Ruby и повысить свой уровень в разработке серверного стека. Количество участников ограничено, так что поторопитесь, пока есть свободные места. Так же, он является автором книг «Работа с Unix процессами», «Работа с TCP сокетами» и «Работа с потоками в Ruby».

В Ruby-сообществе существуют некоторые заблуждения относительно GIL в MRI-реализации интерпретатора. Если вы хотите узнать ответ на главный вопрос этой статьи, без ее прочтения, то вот он: GIL не делает ваш код на Ruby потоко-безопасным.

Но вы не должны принимать мои слова на веру.
Читать дальше →
Всего голосов 11: ↑11 и ↓0 +11
Просмотры 4.8K
Комментарии 2

И еще раз о GIL в Python

Python *Параллельное программирование *
Из песочницы

Предисловие


Область, в которой мне повезло работать, называется вычислительная электрофизиология сердца. Физиология сердечной деятельности определяется электрическими процессами, происходящими на уровне отдельных клеток миокарда. Эти электрические процессы создают электрическое поле, которое достаточно легко измерить. Более того оно очень неплохо описывается в рамках математических моделей электростатики. Тут и возникает уникальная возможность строго математически описать работу сердца, а значит — и усовершенствовать методы лечения многих сердечных заболеваний.

За время работы в этой области у меня накопился некоторый опыт использования различных вычислительных технологий. На некоторые вопросы, которые могут быть интересны не только мне, я постараюсь отвечать в рамках этой публикации.
Читать дальше →
Всего голосов 71: ↑71 и ↓0 +71
Просмотры 36K
Комментарии 47

Moscow Python Meetup в Rambler&Co

Блог компании Rambler&Co Разработка веб-сайтов *Python *Программирование *Django *


8-го октября (четверг) в Rambler&Co мы ждем в гости Moscow Python Meetup. 1-я встреча нового сезона начнется в 19.00. На встрече нас ждут 3 доклада.

Читать дальше →
Всего голосов 13: ↑10 и ↓3 +7
Просмотры 5.2K
Комментарии 3

Деградация программного обеспечения

Open source *Проектирование и рефакторинг *Управление проектами *Управление продуктом *История IT
Перевод
В книге «Электромагнитная эпоха: работа, любовь и жизнь, когда роботы правят миром» Робин Хэнсон кратко обсуждает деградацию программ:

Программное обеспечение изначально было разработано для одного набора задач, инструментов и ситуаций. Но оно медленно изменяется, чтобы справиться с постоянным потоком новых задач, инструментов и ситуаций. Такой софт становится более сложным, хрупким, в него труднее вносить полезные изменения (Леман и Биледи, 1985)1. В конце концов, лучше начать всё сначала и написать с нуля новые подсистемы, а иногда и полностью новые системы.

Я уверен, что это правда. Как правило, грамотная адаптация программного обеспечения к новым условиям занимает больше времени и усилий, чем написание нового программного обеспечения с нуля. Программисты не любят признавать это, но доказательства очевидны. В проектах open source есть несколько известных примеров.
Читать дальше →
Всего голосов 58: ↑56 и ↓2 +54
Просмотры 37K
Комментарии 157

Трассировка Python GIL

Блог компании VK Высокая производительность *Python *Программирование *Отладка *
Перевод


Есть много статей, объясняющих, для чего нужен Python GIL (The Global Interpreter Lock) (я подразумеваю CPython). Если вкратце, то GIL не даёт многопоточному чистому коду на Python использовать несколько ядер процессора.

Однако мы в Vaex исполняем большинство задач с интенсивными вычислениями на С++ с отключением GIL. Это нормальная практика для высокопроизводительных Python—библиотек, в которых Python всего лишь выступает в роли высокоуровневого связующего звена.

GIL нужно отключать явно, и это ответственность программиста, о которой он может забыть, что приведёт к неэффективному использованию мощностей. Недавно я сам побывал в роли забывшего, и нашёл подобную проблему в Apache Arrow (это зависимость Vaex, так что когда GIL не отключается в Arrow, мы (и все остальные) сталкиваемся с падением производительности).

Кроме того, при исполнении на 64 ядрах производительность Vaex иногда далека от идеала. Возможно, он использует 4000 % процессора вместо 6400 %, что меня не устраивает. Вместо того, чтобы наугад вставлять выключатели для изучения этого эффекта, я хочу разобраться в происходящем, и если проблема в GIL, то хочу понять, почему и как он тормозит Vaex.
Читать дальше →
Всего голосов 25: ↑24 и ↓1 +23
Просмотры 6K
Комментарии 2

Программа PyCon Russia: чем живет python-сообщество в 2021

Блог компании IT-People Python *Django *Конференции

8-й по счету PyCon Russia пройдет 5-6 сентября в Клязьма Резорт. Как всегда, встречаемся старой и новой тусовкой питонистов, отдыхаем на природе, поем песни под гитару и пиво, слушаем, какие проекты и как пилят в разных компаниях, и прокачиваемся на мастер-классах.

В этом году программу разделили на 2 тематики: разработка на python и ML& Data Science. 

Смотрите, чем живет и куда двигается python-сообщество.

Читать далее
Всего голосов 3: ↑3 и ↓0 +3
Просмотры 2K
Комментарии 0

Python-культура в российских IT-компаниях. Часть 1: Тинькофф

Блог компании IT-People Python *Конференции

Почему разработчик принимает оффер одной компании и отвергает другой? Глобальный ежегодный опрос Stack Overflow 2020 года показал, что самые важные факторы выбора работы - это языки/ фреймворки/ технологии, на которых предстоит работать, и офисная среда/ корпоративная культура. Помимо вознаграждения, само собой.

Мы расспросили разработчиков и их руководителей о python-разработке. И в серии статей расскажем: как устроена “внутренняя кухня” разработки, проектов и продуктов, как компании адаптируют новичков, и какие мотивы были у опытных разработчиков, когда они делали выбор в пользу своего текущего места работы.

Первый в очереди - Тинькофф.

Читать далее
Всего голосов 6: ↑6 и ↓0 +6
Просмотры 8K
Комментарии 1

Под капотом Ruby. GVL

Ruby *Программирование *Системное программирование *C *Параллельное программирование *

Давным давно уже уже была написана статья о том что такое GVL (или GIL, кому как привычнее) и как он работает, однако с того времени некоторые вещи поменялись (к примеру, , а так же в Ruby 3.0 завезли Ractor'ы - новую абстракцию для реальной параллельной работы тредов. Мне стало интересно узнать что поменялось в планировщике ruby для реализации множества GVL. В этой статье я попытаюсь понять алгоритм, по которому GVL передается от одного треда к другому, как блокирующее IO позволяет продолжить работать другим тредам, а так же выяснить до сих пор ли операция добавления элемента в массив является атомарной операцией

Читать далее
Всего голосов 12: ↑12 и ↓0 +12
Просмотры 3.1K
Комментарии 4

Сколько мы переплачиваем за сервера используя Ruby on Rails

Ruby *Ruby on Rails *Параллельное программирование *

В прошлой статье я разбирался с тем как работает GIL, а сегодня меня захватила идея узнать насколько дорого обходится этот GIL для кода, который исполняется у нас на бэкенде. Для этого я решил пропатчить MRI и добавить пару переменных, в которые буду засекать сколько времени поток реально выполнял код, а сколько ничего не делал и ждал пока ему удастся завладеть локом.

Читать далее
Всего голосов 16: ↑12 и ↓4 +8
Просмотры 8.3K
Комментарии 55

Глобальная блокировка интерпретатора (GIL) и её воздействие на многопоточность в Python

Блог компании Wunder Fund Python *Программирование *Алгоритмы *
Перевод

Прим. Wunder Fund: в статье рассказано, зачем появилась и существует глобальная блокировка интерпретатора в Питоне, как она работает, и как она влияет на скорость работы Питона, а также о том, куда в будущем, вероятно, будет двигаться Питон. У нас в фонде почти всё, что не написано на плюсах — написано на Питоне, мы пристально следим за тем, куда движется язык, и если вы тоже — вы знаете, что делать )

Как вы, наверное, знаете, глобальная блокировка интерпретатора (GIL, Global Interpreter Lock) — это механизм, обеспечивающий, при использовании интерпретатора CPython, безопасную работу с потоками. Но из-за GIL в конкретный момент времени выполнять байт-код Python может лишь один поток операционной системы. В результате нельзя ускорить Python-код, интенсивно использующий ресурсы процессора, распределив вычислительную нагрузку по нескольким потокам. Негативное влияние GIL на производительность Python-программ, правда, на этом не заканчивается. Так, GIL создаёт дополнительную нагрузку на систему. Это замедляет многопоточные программы и, что выглядит достаточно неожиданно, может даже оказать влияние на потоки, производительность которых ограничена подсистемой ввода/вывода.

Здесь я опираюсь на особенности CPython 3.9. По мере развития CPython некоторые детали реализации GIL, определённо, изменятся. Материал опубликован 22 сентября 2021 года, после публикации в него внесено несколько дополнений.

Читать далее
Всего голосов 63: ↑60 и ↓3 +57
Просмотры 20K
Комментарии 12
1