Является ли concurrent.futures лекарством от GIL?

Я просто искал эту новую реализацию, и я использую python 2.7, я должен установить это, поэтому если я воспользуюсь им, я забуду слово GIL на CPython?


person Abdelouahab Pp    schedule 20.02.2013    source источник
comment
dalkescientific.com/writings/diary/archive/ 19.01.2012 /   -  person Robert Harvey    schedule 21.02.2013
comment
docs.python.org/dev/library/ - ничего не упоминается о GIL, поэтому используемые потоки, по-видимому, являются настоящими потоками. Иначе зачем заморачиваться со всей этой ерундой?   -  person Robert Harvey    schedule 21.02.2013
comment
Я обнаружил, что асинхронный код любит использовать concurrent.futures, поэтому я сказал, что это лекарство для GIL   -  person Abdelouahab Pp    schedule 21.02.2013
comment
@RobertHarvey: Вы всегда можете создать GreenThreadExecutor, который соответствует future API. (Однако это оказывается немного сложным, поэтому tulip привнесет немного другой future в stdlib для использования с его циклом событий сопрограммы.)   -  person abarnert    schedule 21.02.2013


Ответы (1)


Нет, concurrent.futures почти не имеет никакого отношения к GIL.

Использование процессов вместо потоков - лекарство от GIL. (Конечно, как и все лекарства, у него есть побочные эффекты. Но оно работает.)

Модуль futures просто дает вам более простой способ планировать и ждать выполнения задач, чем использование threading или multiprocessing напрямую. И у него есть дополнительное преимущество, заключающееся в том, что вы можете переключаться между пулом потоков и пулом процессов (и, возможно, даже циклом гринлета или чем-то безумным, которое вы изобретаете и создаете) без изменения кода future. Итак, если вы не знаете, будут ли в вашем коде проблемы с GIL, вы можете создать его для использования потоков, а затем переключить его на использование процессов с однострочным изменением, что довольно приятно.

Но если вы используете ThreadPoolExecutor, у него будут те же проблемы с GIL, как если бы вы вручную создавали пул потоков, очередь задач и т. Д. С помощью threading и queue. Если вы используете ProcessPoolExecutor, это позволит избежать проблем с GIL таким же образом (и с теми же компромиссами), как если бы вы использовали multiprocessing вручную.

А пакет PyPI - это всего лишь простой бэкпорт модуля concurrent.futures от 3.2 до 2.x (и 3.0-3.1). (Это не волшебным образом дает вам новый и вроде бы улучшенный 3,2 GIL или более улучшенный 3,3 GIL, не говоря уже об удалении GIL.)


Мне, наверное, не стоило даже упоминать изменения GIL, потому что это, кажется, только добавило путаницы ... но теперь позвольте мне попытаться исправить это, ужасно упрощая.

Если у вас нет ничего, кроме работы, связанной с вводом-выводом, потоки - отличный способ добиться параллелизма до разумного предела. И 3.3 заставляет их работать еще лучше, но для большинства случаев 2.7 уже достаточно, а для большинства случаев, где это не так, 3.3 все еще недостаточно хорош. Если вы хотите обрабатывать 10000 одновременных клиентов, вы захотите использовать цикл событий (например, twisted, tornado, gevent, tulip и т. Д.) Вместо потоков.

Если у вас есть работа, связанная с процессором, потоки вообще не помогают распараллелить эту работу. Фактически, они только усугубляют ситуацию. 3.3 делает это наказание не таким серьезным, но это все же штраф, и вам все равно никогда не следует этого делать. Если вы хотите распараллелить работу ЦП, вы должны использовать процессы, а не потоки. Единственное преимущество 3.3 состоит в том, что futures немного проще в использовании, чем multiprocessing, и он встроен, и его не нужно устанавливать.

Я не хочу отговаривать вас от перехода на 3.3, потому что это лучшая реализация лучшего языка, чем 2.7. Но лучший параллелизм - не повод двигаться дальше.

person abarnert    schedule 20.02.2013
comment
так это разные вещи! Дело в том, что GIL был переписан на 3.2, и мне кажется, что это concurrent.futures, которая решает проблему, спасибо :) - person Abdelouahab Pp; 21.02.2013
comment
@AbdelouahabPp: Нет, concurrent.futures не решает никаких проблем, кроме проблемы упрощения написания параллельного кода. Изменения GIL в 3.2 и 3.3 полностью независимы, и это просто совпадение, что первое значительное изменение GIL за более чем десятилетие появилось в той же версии Python, что и библиотека futures. - person abarnert; 21.02.2013
comment
так что я должен затем переключиться на 3.3, если я хочу получить отличный параллельный код! спасибо :) и мне очень жаль, потому что я вернусь к этой теме несколько раз, чтобы получить больше информации, я новичок и нашел эту библиотеку с Tornado - person Abdelouahab Pp; 21.02.2013
comment
@AbdelouahabPp: По-прежнему нет. То есть да, вам стоит перейти на 3.3. Но не для того, чтобы получить отличный параллельный код. Позвольте мне обновить ответ. - person abarnert; 21.02.2013
comment
Преимущество оставаться на 2.7 - это множество библиотек, которые не переключились на 3.x (например, отличный passlib), я постараюсь больше понять многопроцессорность и постараюсь найти способ на 2.7, еще раз спасибо :) - person Abdelouahab Pp; 21.02.2013
comment
@AbdelouahabPp: Во-первых, passlib переключился на 3.x. Из pypi.python.org/pypi/passlib: Passlib - это библиотека хеширования паролей для Python 2 & 3. И я только что сделал pip-3.3 install passlib, и он отлично работает. Во-вторых, многопроцессорность в 2.7 почти такая же, как в 3.3. Модуль multiprocessing почти идентичен между 2.7 и 3.3, а бэкпорт PyPI futures почти идентичен 3.3 concurrent.futures в stdlib. - person abarnert; 21.02.2013
comment
так что я буду придерживаться 2.7, через несколько дней будет обновление;) - person Abdelouahab Pp; 21.02.2013
comment
@AbdelouahabPp: Я не понимаю, о чем вы. Если вы придерживаетесь 2.7, пока passlib не станет доступен для 3.3, вам не нужно ждать. Он уже доступен для версии 3.3. - person abarnert; 21.02.2013
comment
Я просто хочу перейти на 3.x, потому что я думаю, что однажды миграция будет, потому что то, что я считаю новым для 3.x по сравнению с 2.x, подталкивает меня к переходу на 3.x, поэтому я подготовлюсь я бы однажды переключился: D - person Abdelouahab Pp; 21.02.2013
comment
и я просто помню, Passlib не поддерживает BCrypt для python 3.x code.google.com/p/passlib/issues/ - person Abdelouahab Pp; 21.02.2013