Чистая, легкая альтернатива Python скручена?

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

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

Изменить: Похоже, что там также cogen, что похоже, но использует улучшенные генераторы Python 2.5 для своих сопрограмм, вместо Greenlets. Это делает его более переносимым, чем совпадение и другие альтернативы. Сетевой ввод-вывод выполняется непосредственно с помощью epoll/kqueue/iocp.

Ответ 2

Twisted сложна, вы правы в этом. Скрученный не раздувается.

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

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

Ответ 3

gevent очистка события....

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

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

Подобно eventlet, он делает ненужные обратные вызовы и Отсрочки, используя greenlets.

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Все остальные асинхронные библиотеки, с которыми я работал, становятся менее зрелыми, чем они появляются. Скрученный цикл событий является сплошным.

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

Существует хорошая книга по теме: "Основы витой поддержки сети", Абэ Феттиг. Примеры показывают, как писать очень Pythonic-код, и для меня лично, не ударяйте меня, основываясь на раздутой структуре. Посмотрите на решения в книге, если они не чисты, тогда я не знаю, что такое чистые средства.

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

Ответ 10

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

Ответ 11

Также попробуйте Syncless. Он основан на сопрограмме (так похож на Concurrence, Eventlet и gevent). Он реализует неблокирующие замены для socket.socket, socket.gethostbyname(и т.д.), Ssl.SSLSocket, time.sleep и select.select. Это быстро. Ему нужен Stackless Python и libevent. Он содержит обязательное расширение Python, написанное на C (Pyrex/Cython).

Ответ 12

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

Ответ 13

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

Ответ 14

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

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

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