GIL в Python 3.1

Кто-нибудь знает судьбу Global Interpreter Lock в Python 3.1 против многопоточной интеграции C++?


person Dewfy    schedule 03.08.2009    source источник


Ответы (7)


GIL все еще присутствует в CPython 3.1; проект Unladen Swallow направлен (среди многих других средств повышения производительности) на его удаление, но он все еще далек от своих целей и сначала работает над 2.6 с намерением в конечном итоге перенести на 3.x для любого x, который будет текущим к тому времени, когда версия 2.y будет считаться готовой. На данный момент многопроцессорность (вместо многопоточности) остается предпочтительным способом использования нескольких ядер в CPython (IronPython и Jython тоже хороши, но в настоящее время они не поддерживают Python 3, а также не упрощают интеграцию с C++; - ).

person Alex Martelli    schedule 03.08.2009
comment
Спасибо, за ответ. Надеемся, что IronPython имеет многопоточное решение после интеграции с CLR. Но моя задача — подключить Python к существующему кроссплатформенному приложению C++. Вот почему ни IronPython, ни многопроцессорность не выглядят хорошо. - person Dewfy; 03.08.2009
comment
GIL не повлияет на ваше приложение C++, если все точки входа из Python в него используют правильный макрос для обеспечения свободной потоковой передачи — только собственное выполнение Python будет сериализовано (при этом GIL в любом случае будет удален во время ввода-вывода и т. д.). Ironclad, resolversystems.com/documentation/index.php/Ironclad.html, предлагает некоторую (пока неполную) помощь с интерфейсом IronPython‹-›C/C++, но мультиплатформенность не является сильной стороной .NET в настоящее время; и я не знаю подобных помощников для Jython. - person Alex Martelli; 03.08.2009

Значительные изменения произойдут в GIL для Python 3.2. Взгляните на Что нового в Python 3.2, и поток, инициировавший его в списке рассылки.

Хотя эти изменения не означают конец GIL, они предвещают потенциально огромный прирост производительности.

Обновление0

  • Общий прирост производительности с новым GIL в версии 3.2 Антуана Питру был незначительным, и вместо этого он был сосредоточен на устранении проблем с конфликтами. которые возникают в некоторых крайних случаях.
  • замечательная попытка Дэвида Бизли была предпринята для реализации планировщика для значительного повышения производительности, когда потоки, связанные с ЦП и вводом-выводом, смешанный, который к сожалению был сбит.
  • Работа Unladen Swallow была предложена для слияния в Python 3.3, но это было отозван из-за отсутствия результатов в этом проекте. PyPy теперь является предпочтительным проектом и в настоящее время запрашивает финансирование для добавления поддержки Python3k. В настоящее время очень мало шансов, что PyPy станет стандартом по умолчанию.

В течение последних 15 лет предпринимались попытки удалить GIL из CPython, но в обозримом будущем он останется.

person Matt Joiner    schedule 26.01.2010
comment
@Matt Joiner Я внимательно смотрю на Unladen Swallow (code.google.com/p/unladen -ласточка). Это единственное решение с точки зрения моего вопроса. - person Dewfy; 26.01.2010
comment
@Dewfy, я взглянул на unladen-swallow, и они открыто признают, что не достигли такого успеха, как надеялись. однако их усилия могут быть объединены в python 3.3, python.org/dev/peps/pep -3146 - person Matt Joiner; 27.01.2010
comment
давайте скрестим пальцы, чтобы python 3.3 преуспел в многопоточности - person Dewfy; 27.01.2010

GIL не повлияет на ваш код, который не использует объекты Python. В Numpy мы выпускаем GIL для вычислительного кода (вызовы линейной алгебры и т. д.), и базовый код может свободно использовать многопоточность (на самом деле, это, как правило, сторонние библиотеки, которые ничего не знают о python).

person David Cournapeau    schedule 04.08.2009
comment
Но именно то, что я хочу - запустить несколько подключенных скриптов одновременно. Эта идея закрепилась даже тогда, когда два одновременно исполняемых куска Python не использовали общие ресурсы. - person Dewfy; 04.08.2009

ГИЛ хорошая штука.

Просто заставьте ваше приложение C++ выпустить GIL, пока оно выполняет свою многопоточную работу. Код Python будет продолжать выполняться в других потоках без изменений. Приобретайте GIL только тогда, когда вам нужно прикоснуться к объектам Python.

person nosklo    schedule 03.08.2009

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

self.foo(self.bar, 3, val)

На данный момент может быть как минимум 3 (если val является глобальным) поиском по хеш-таблице и, возможно, даже намного больше, если кеш метода не горячий (в зависимости от глубины наследования класса)

Это дорого — вот почему Java отказалась от этой идеи и представила хеш-таблицы, которые не используют вызов монитора, чтобы избавиться от своего товарного знака «Java Is Slow».

person Lothar    schedule 21.09.2009
comment
Есть ли информация о том, как Jython и IronPython решают одну и ту же проблему? - person Pavel Minaev; 22.09.2009
comment
@Pavel, IronPython использует подход .Net - только явно объявленные методы являются потокобезопасными, поскольку это динамический язык (предоставляемый .Net 3.5), нет никакой разницы между кодом .py и C #. - person Dewfy; 22.09.2009
comment
@Lothar Вы, например, связаны с внедрением GIL, поэтому я категорически не согласен с тем, что у вас уже есть как минимум 3 ... . Альтернативой, например, может быть квартирная модель — вы запускаете какой-то экземпляр Python в квартире и смешиваете код с C++ как хотите. Синхронизация - это ответ программиста. Когда 2 или более потоков нуждаются в сотрудничестве, вы предоставляете их по запросу. - person Dewfy; 22.09.2009
comment
Не знаю, что такое модель квартиры, я думаю, вы просто имеете в виду отдельное пространство памяти. Да, именно так это делает TCL, но это будет просто другой стиль реализации модели многопроцессорности. Для меня потоки всегда означают общую память, и поэтому вы должны совместно использовать экземпляр интерпретатора и среду выполнения python. А среда выполнения и интерпретатор имеют множество внутренних структур, которые необходимо защищать. Даже если вас не волнует, позволите ли вы программе python вызвать сбой интерпретатора, вам нужен GIL или какая-то синхронизация. - person Lothar; 22.09.2009

Я так понимаю планировщик "brainfuck" заменит GIL из python 3.2

планировщик BFS bainfuck

person sayth    schedule 11.02.2011
comment
Этого не произошло, это было отклонено. :( - person Matt Joiner; 29.09.2011

Если GIL мешает, просто используйте модуль multiprocessing. Он порождает новые процессы, но использует модель потоков и (большую часть) API. Другими словами, вы можете реализовать параллелизм процессов наподобие потоков.

person Alex    schedule 11.02.2011
comment
это не относится к моему вопросу. Вы говорите с точки зрения разработчика Python. Меня беспокоит точка зрения разработчика С++ - person Dewfy; 14.02.2011