Чистый, легкая альтернатива на Python запутано? [закрытый]

A (давно) некоторое время назад я написал веб-паука, который я многопоточный, чтобы разрешить одновременные запросы одновременно. Это было в моей юности, в дни, когда я еще не знал о Гиль и связанные с ним проблемы, которые он создает для многопоточного кода (т. е. большую часть времени материал просто сериализуется!)...

Я хочу, чтобы переработать этот код, чтобы сделать его более надежным и лучше. Есть в основном два способа сделать это: я мог бы использовать новый модуль многопроцессорной в 2.6+ или я мог бы пойти на реактор / модель на основе событий какого-то рода. Я бы предпочел сделать это позже, так как это намного проще и менее подвержено ошибкам.

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

  • витая: дедушка Python Reactor Framework: кажется сложным и немного раздутым. Крутые обучения кривая для небольшой задачи.
  • Eventlet: от ребят в lindenlab. Основой гринлет, что направлена на такие задачи. Я посмотрел на код, хотя и это не слишком красиво: не совместимый с pep8, разбросанный с отпечатками (почему люди делают это в рамках!?), API кажется немного непоследовательным.
  • PyEv: незрелый, похоже, никто не использует его прямо сейчас, хотя он основан на libevent, поэтому у него есть солидный бэкэнд.
  • asyncore: из stdlib: über low-level, похоже, много работы с ногами, чтобы что-то поднять с земли.
  • торнадо: хотя это серверный продукт, ориентированный на серверные динамические веб-сайты, он имеет асинхронный HTTP-клиент и просто ioloop. Похоже, это могло бы сделать работу, но не то, для чего она была предназначена. [edit: не работает в Windows к сожалению, что отсчитывает его для меня - это требование для меня, чтобы поддержать эту хромую платформу]

есть ли что-нибудь, что я пропустил вообще? Конечно, должна быть библиотека, которая соответствует сладкому пятну упрощенной асинхронной сетевой библиотеки!

[edit: большое спасибо intgr для его указателя на на этой странице. Если вы прокрутите вниз, вы увидите, что есть действительно хороший список проектов, которые направлены на решение этой задачи в так или иначе. Кажется, на самом деле все действительно пошло дальше с момента создания Twisted: люди теперь, кажется, предпочитают совместное рутинную основанное решение, а не традиционный реактор / обратный вызов, ориентированный один. Преимущества этого подхода яснее более прямого кода: я, безусловно, нашел в прошлом, особенно при работе с импульс.asio в C++ этот код на основе обратного вызова может привести к конструкциям, которые могут быть труднодоступными и относительно неясными для неопытный глаз. Использование co-routines позволяет писать код, который выглядит немного более синхронным, по крайней мере. Думаю, теперь моя задача-выяснить, какая из этих многих библиотек мне нравится, и дать ей шанс! Хорошо, что я спросил...]

[edit: возможно, представляет интерес для тех, кто следовал или наткнулся на этот вопрос или заботится об этой теме в любом смысле: я нашел действительно большую запись текущего состояния доступные инструменты на эту работу]

14 ответов


мне понравилось согласие модуль Python, который полагается либо на Stackless Python microthreads или Greenlets для легкой резьбы. Весь блокирующий сетевой ввод-вывод прозрачно выполнен асинхронным через один libevent цикл, поэтому он должен быть почти таким же эффективным, как настоящий асинхронный сервер.

Я полагаю, что это похоже на Eventlet таким образом.

недостатком является то, что его API сильно отличается от Python sockets/threading модули; вам нужно чтобы переписать справедливый бит вашего приложения (или написать слой прокладки совместимости)

Edit: кажется, что есть еще теплофикационного цикла., который похож, но использует Python 2.5 л!--16-->улучшенные генераторы для сопрограмм, а не это. Это делает его более портативным, чем согласия и других альтернатив. Сетевой ввод-вывод выполняется непосредственно с помощью epoll/kqueue / iocp.


Twisted является сложным, вы правы об этом. Twisted is не обожравшись.

Если вы посмотрите здесь:http://twistedmatrix.com/trac/browser/trunk/twisted Вы найдете организованный, всеобъемлющий и очень хорошо протестированный набор много протоколы интернета, а также вспомогательный код для написания и развертывания очень сложных сетевых приложений. Я бы не стал путать вздутие живота с полнотой.

известно, что скрученная документация не самая удобная с первого взгляда, и я считаю, что это отворачивает несчастное количество людей. Но Twisted удивительно (IMHO), если вы положили время. Я сделал, и это оказалось того стоит, и я бы рекомендовал другим попробовать то же самое.


gevent и eventlet подчистил.

API-wise он следует тем же соглашениям, что и стандартная библиотека (в частности, потоковые и многопроцессорные модули), где это имеет смысл. Итак, у вас есть знакомые вещи, такие как очереди и событие для работы.

Он поддерживает только libevent (обновление: libev с 1.0) как осуществление реактора но принимает полное преимущество из него, показывая быстрый сервер WSGI на основе libevent-http и разрешение DNS-запросов через libevent-dns, в отличие от использования пула потоков, как и большинство других библиотек. (обновление: поскольку 1.0 c-ares используется для создания асинхронных DNS-запросов; threadpool также является опцией.)

Как eventlet, он делает обратные вызовы и отсрочки ненужными с помощью это.

проверить примеры: одновременная загрузка нескольких URL-адресов, длинный опрос webchat.


действительно интересные сравнения из таких фреймворков был составлен Николасом Пиэлем в своем блоге: это стоит прочитать!


ни одно из этих решений не избежит того факта, что GIL предотвращает параллелизм ЦП - это просто лучшие способы получить параллелизм ввода-вывода, который у вас уже есть с потоками. Если вы думаете, что можете сделать лучше IO, обязательно выполните одно из них, но если ваше узкое место в обработке результатов, ничто здесь не поможет, кроме модуля многопроцессорной обработки.


Я бы не пошел так далеко, чтобы назвать скрученный раздутый, но трудно обернуть голову вокруг. Я избегал действительно осесть в learn на некоторое время, поскольку я всегда хотел что-то немного легче для "небольших задач".

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

все другие асинхронные библиотеки, с которыми я работал, были менее зрелыми, чем они даже появляются. Цикл событий Twisted является сплошным.

Я не совсем уверен,как решить крутую кривую обучения. Это может помочь, если кто-то раскошелится и очистит несколько вещей, например, удалит всю обратную совместимость и мертвые проекты. Но такова природа зрелого программного обеспечения.


Kamaelia еще не упомянул. Его модель параллелизма основана на соединении компонентов вместе с сообщением, проходящим между почтовыми ящиками и исходящими. здеськраткий обзор.


Я начал использовать twisted для некоторых вещей. Красота ее почти в том, что она "раздута".- Там есть разъемы почти для любого из основных протоколов. У вас может быть бот jabber, который будет принимать команды и отправлять их на сервер irc, отправлять их кому-то, запускать команду, читать с сервера NNTP и отслеживать веб-страницу для изменений. Плохая новость в том, что он может сделать все это и может сделать вещи слишком сложными для простых задач, таких как объясненная OP. Преимущество python хотя вы включаете только то, что вам нужно. Поэтому, хотя загрузка может быть 20mb, вы можете включать только 2MB библиотек (что все еще много). Моя самая большая жалоба с twisted, хотя они включают примеры, все, что выходит за рамки базового tcp-сервера, вы сами по себе.

хотя это не решение python, я видел узел.в последнее время js получает намного больше тяги. На самом деле я рассматривал его для небольших проектов, но я просто съеживаюсь, когда слышу javascript:)


есть хорошая книга на эту тему: "Twisted Network Programming Essentials", Абэ Феттиг. Примеры показывают, как писать очень Питонический код, и лично мне, не кажется, что он основан на раздутой структуре. Посмотрите на решения в книге, если они не чисты, тогда я не знаю, что такое чистота.

моя единственная загадка такая же, как у меня с другими фреймворками, такими как Ruby. Я волнуюсь, он увеличивается? Я бы не хотел поручать клиенту фреймворк, который идет иметь проблемы масштабируемости.


Whizzer - это крошечная асинхронная структура сокета, которая использует pyev. Его очень быстро, в первую очередь из-за pyev. Он пытается предоставить аналогичный интерфейс, скрученный с некоторыми небольшими изменениями.


попробовать Syncless. Это сопрограмма основе (так это похоже на совпадение, Eventlet и gevent). Он реализует в неблокирующий замен для гнездо.розетка, розетка.gethostbyname (etc.), использование SSL.Этого sslsocket, время.спать и выбирать.выбирать. Это быстро. Ему нужны Stackless Python и libevent. Он содержит обязательное расширение Python, написанное на C (Pyrex/Cython).


Я подтверждаю доброту syncless. Он может использовать libev (более новую, более чистую и более производительную версию libevent). Несколько раз назад он не имеет такой поддержки, как libevent, но теперь процесс разработки идет дальше и очень полезен.


Если вы просто хотите упрощенную, легкую библиотеку HTTP-запросов, то я нахожу Unirest очень хорошо


вы можете взглянуть на PyWorks, который использует совершенно другой подход. Он позволяет экземплярам объектов работать в собственном потоке и делает вызов функции для этого объекта асинхронным.

просто позвольте классу наследовать от Task вместо object, и это async, все вызовы методов являются Прокси. Возвращаемые значения (если они вам нужны) являются будущими прокси.

res = obj.method( args )
# code continues here without waiting for method to finish
do_something_else( )
print "Result = %d" % res # Code will block here, if res not calculated yet

PyWorks можно найти на http://bitbucket.org/raindog/pyworks