Чистый, легкая альтернатива на Python запутано? [закрытый]
a (давно) некоторое время назад я написал веб-паук, который я многопоточный, чтобы позволить одновременным запросам происходить одновременно. Это было в моей юности питона, в те дни, когда я еще не знал о Гиль и связанные с этим проблемы, которые он создает для многопоточного кода (т. е. большую часть времени материал просто заканчивается сериализацией!)...
Я хочу, чтобы переработать этот код, чтобы сделать его более надежным и лучше. Есть в основном два способа сделать это: я мог бы использовать новый модуль многопроцессорной в 2.6+ или я мог бы пойти на реактор / событийную модель какого-то рода. Я бы предпочел сделать позже, так как это гораздо проще и менее подвержено ошибкам.
Итак, вопрос касается того, какие рамки лучше всего подходят для моих потребностей. Ниже приведен список опций, о которых я знаю до сих пор:
витая: дедушка Python reactor Framework: кажется сложным и немного раздутым, однако. Крутое обучение кривая для небольшой задачи.
Eventlet: от ребят в lindenlab. Greenlet на основе структуры, которая ориентирована на эти виды задач. Я посмотрел на код, хотя и это не слишком красиво: не совместимый с pep8, разбросанный с отпечатками (почему люди делают это в рамках!?), API кажется немного непоследовательным.
PyEv: незрелый, кажется, никто не использует его прямо сейчас, хотя он основан на libevent, поэтому у него есть солидный бэкэнд.
asyncore: от stdlib: über низкого уровня, кажется, что много работы ног участвует только, чтобы получить что-то от Земли.
торнадо: хотя это серверный ориентированный продукт, предназначенный для динамических веб-сайтов сервера, он имеет асинхронный HTTP-клиент и просто ioloop. Похоже, что это может сделать работу, но не то, для чего она была предназначена.
[edit: не работает в Windows к сожалению, что отсчитывает его для меня - это требование для меня, чтобы поддержать эту хромую платформу]
есть ли что-нибудь, что я пропустил вообще? Конечно, там должна быть библиотека, которая подходит для сладкого пятна упрощенной асинхронной сетевой библиотеки!
[edit: большое спасибо intgr для его указателя на на этой странице. Если вы прокрутите вниз, вы увидите, что есть действительно хороший список проектов, которые направлены на решение этой задачи в так или иначе. Кажется, что на самом деле все действительно пошло с момента создания Twisted: люди теперь, похоже, предпочитают a совместная работа основанное решение, а не традиционный реактор / обратный вызов, ориентированный на него. Преимущества этого подхода яснее более прямого кода: я, конечно, нашел в прошлом, особенно при работе с импульс.асио в C++ этот код на основе обратного вызова может привести к конструкциям, которые могут быть труднодостижимыми и относительно неясными для неопытный глаз. Использование совместных процедур позволяет писать код, который выглядит немного более синхронно, по крайней мере. Я думаю, теперь моя задача-выяснить, какая из этих многочисленных библиотек мне нравится, и дать ей шанс! Рад, что я спросил сейчас...]
[edit: возможно, представляет интерес для всех, кто следил или наткнулся на этот вопрос или заботится об этой теме в любом смысле: я нашел действительно большую запись текущего состояния доступные инструменты на эту работу]
14 ответов:
мне понравилось согласие модуль Python, который опирается на Либо Stackless Python microthreads или Greenlets для легкой резьбы. Все блокирующие сетевые операции ввода / вывода прозрачно выполняются асинхронно через один
libeventцикл, поэтому он должен быть почти таким же эффективным, как реальный асинхронный сервер.Я полагаю, что это похоже на Eventlet таким образом.
недостатком является то, что его API сильно отличается от Python
sockets/threadingмодули; вам нужно чтобы переписать справедливый бит вашего приложения (или написать слой совместимости оболочки)Edit: кажется, что есть и теплофикационного цикла., который похож, но использует Python 2.5 л!--16-->улучшенные генераторы для сопрограмм, а не это. Это делает его более портативным, чем совпадение и другие альтернативы. Сетевой ввод-вывод выполняется непосредственно с помощью epoll/kqueue / iocp.
Twisted является сложным, вы правы об этом. Витой это не обожравшись.
Если вы посмотрите здесь:http://twistedmatrix.com/trac/browser/trunk/twisted Вы найдете организованный, всеобъемлющий и очень хорошо протестированный набор много протоколы интернета, а также вспомогательный код для написания и развертывания очень сложных сетевых приложений. Я бы не стал путать раздувание с полнотой.
известно, что скрученная документация не самая удобная с первого взгляда, и я считаю, что это отворачивает несчастное количество людей. Но Twisted-это удивительно (ИМХО), если вы вкладываете время. Я сделал, и это оказалось того стоит, и я бы рекомендовал другим попробовать то же самое.
API-wise он следует тем же соглашениям, что и стандартная библиотека (в частности, модули потоковой и многопроцессорной обработки), где это имеет смысл. Так что у вас есть знакомые вещи, как очереди и событие для работы.
Он поддерживает только libevent (обновление:libev с 1.0) в качестве реализации реактора, но в полной мере из них, благодаря быстрому серверу WSGI на основе libevent-http и разрешению DNS-запросов через libevent-dns, а не с помощью пула потоков, как это делают большинство других библиотек. (обновление: поскольку 1.0 c-ares используется для выполнения асинхронных DNS-запросов; threadpool также является опцией.)
Как eventlet, это делает обратные вызовы и отсрочки ненужными с помощью это.
проверить примеры: одновременная загрузка нескольких URL-адресов, - опрос пользователей чата.
действительно интересные сравнения из таких рамок был составлен Николас Пиель в своем блоге: это хорошо стоит прочитать!
ни одно из этих решений не позволит избежать того факта, что GIL предотвращает параллелизм процессора - это просто лучшие способы получения параллелизма ввода-вывода, которые у вас уже есть с потоками. Если вы думаете, что можете сделать лучше IO, обязательно выполните один из них, но если ваше узкое место заключается в обработке результатов, ничто здесь не поможет, кроме многопроцессорного модуля.
Я бы не зашел так далеко, чтобы назвать Twisted раздутым, но трудно обернуть голову вокруг. Я действительно избегать заселения в ЖЖ долгое время, как я всегда хотел что-то немного легче для малых задач.
однако, теперь, когда я работал с ним еще немного, я должен сказать, что все батареи включены очень приятно.
все другие асинхронные библиотеки, с которыми я работал, были менее зрелыми, чем они даже появляются. Цикл событий Twisted является твердым.
Я не совсем уверен, как решить крутую кривую обучения. Это может помочь, если кто-то разветвит его и очистит несколько вещей, например, удалит всю обратную совместимость cruft и мертвые проекты. Но это природа зрелого программного обеспечения, я думаю.
Я начал использовать twisted для некоторых вещей. Красота его почти в том, что он "раздутый"."Там есть разъемы практически для любого из основных протоколов. У вас может быть бот jabber, который будет принимать команды и отправлять сообщения на сервер irc, отправлять их кому-то по электронной почте, запускать команду, читать с сервера NNTP и отслеживать веб-страницу для изменений. Плохая новость заключается в том, что он может сделать все это и может сделать вещи слишком сложными для простых задач, таких как OP объяснил. Преимущество python хотя вы включаете только то, что вам нужно. Поэтому, хотя загрузка может быть 20 Мб, вы можете включить только 2 Мб библиотек (что все еще много). Моя самая большая жалоба с twisted, хотя они включают примеры, все, что выходит за рамки базового tcp-сервера, вы сами по себе.
хотя это не решение python,я видел узел.js получает намного больше тяги в последнее время. На самом деле я рассматривал его для небольших проектов, но я просто съеживаюсь, когда слышу javascript :)
есть хорошая книга на эту тему: "Twisted Network Programming Essentials", by Abe Fettig. Примеры показывают, как писать очень Питонский код, и лично мне не кажется, что он основан на раздутой структуре. Посмотрите на решения в книге, если они не чисты, то я не знаю, что такое чистый.
моя единственная загадка-это то же самое, что и у меня с другими фреймворками, такими как Ruby. Я волнуюсь, это масштабируется? Я бы не хотел, чтобы клиент был привязан к фреймворку, который собирается чтобы иметь проблемы масштабируемости.
Whizzer - это крошечная асинхронная структура сокетов, которая использует pyev. Это очень быстро, в первую очередь из-за пиева. Он пытается обеспечить аналогичный интерфейс, как скрученный с некоторыми незначительными изменениями.
попробовать Syncless. Он основан на сопрограмме (поэтому он похож на Concurrence, Eventlet и gevent). Он реализует выпадающие неблокирующие замены для сокета.розетка, розетка.gethostbyname (etc.), использование SSL.SSLSocket, время.спи и выбирай.выбирать. Это быстро. Для этого нужны Stackless Python и libevent. Он содержит обязательное расширение Python, написанное на C (Pyrex/Cython).
Я подтверждаю доброту syncless. Он может использовать libev (более новую, более чистую и лучшую версию производительности libevent). Несколько раз назад у него не было такой поддержки, как у libevent, но теперь процесс разработки идет дальше и очень полезен.
Если вы просто хотите упрощенную, легкую библиотеку HTTP-запросов, то я нахожу Unirest очень хорошо
вы можете взглянуть на PyWorks, который использует совершенно другой подход. Он позволяет экземплярам объектов работать в своем собственном потоке и делает вызов функции для этого объекта асинхронным.
просто позвольте классу наследовать от задачи вместо объекта, и это асинхронно, все вызовы методов являются Прокси. Возвращаемые значения (если они вам нужны) являются будущими прокси.
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 yetPyWorks можно найти на http://bitbucket.org/raindog/pyworks
Comments