(Давным-давно) я написал веб-паук, который я многопоточный для одновременного выполнения запросов. Это было в моей юности Python, в те дни, когда я знал о GIL и связанных с ним проблемах, которые он создает для многопоточного кода (IE, в большинстве случаев, все просто заканчивается сериализацией!) ...
Я хотел бы переработать этот код, чтобы сделать его более надежным и работать лучше. В принципе, я мог бы сделать это двумя способами: я мог бы использовать новый многопроцессорный модуль в версии 2.6+ или использовать модель, основанную на реакторах / событиях. Я бы предпочел сделать позже, так как это намного проще и менее подвержено ошибкам.
Таким образом, вопрос касается того, какая структура будет лучше всего соответствовать моим потребностям. Ниже приведен список параметров, о которых я знаю:
- Twisted : дедушка Python каркас реактора: кажется сложным и немного раздутым, однако. Крутая кривая обучения для небольшой задачи.
- Eventlet : От парней из Lindenlab . Фреймворк на основе Greenlet, предназначенный для решения подобных задач. Хотя я взглянул на код, и он не слишком красивый: не соответствует pep8, разбросан по принтам (почему люди делают это в рамках !?), API кажется немного непоследовательным.
- PyEv : Незрелый, похоже, никто не использует его сейчас, хотя он основан на libevent, поэтому у него есть солидный бэкэнд.
- asyncore : из stdlib: über low-level, кажется, что нужно приложить много усилий, чтобы просто что-то поднять.
- tornado : Хотя это серверный продукт, предназначенный для динамических веб-сайтов, в нем есть асинхронный HTTP-клиент и простой ioloop . Похоже, что это может сделать работу, но не то, для чего она была предназначена. [править: к сожалению, не работает в Windows, что для меня важно - это требование для меня, чтобы поддерживать эту слабую платформу]
Я что-то пропустил? Конечно, должна существовать библиотека, которая подходит для сладкой асинхронной сетевой библиотеки!
[edit: большое спасибо intgr за указатель на эту страницу . Если вы прокрутите вниз, то увидите, что есть действительно хороший список проектов, которые нацелены на то или иное решение этой задачи. Похоже, что с момента появления Twisted все действительно пошло дальше: теперь люди предпочитают решение, основанное на совместной рутине, а не традиционное решение, ориентированное на реактор / обратный вызов. Преимущества этого подхода заключаются в более четком и понятном коде: я наверняка обнаружил это в прошлом, особенно при работе с boost.asio.в C ++ этот код, основанный на обратном вызове, может привести к проектам, которые могут быть трудны для понимания и относительно неясны для неопытного глаза. Использование сопрограмм позволяет вам писать код, который выглядит как минимум немного более синхронным. Думаю, теперь моя задача - выяснить, какая из этих многочисленных библиотек мне нравится, и попробовать! Рад, что спросил сейчас ...]
[править: возможно, представляет интерес для тех, кто следил или наткнулся на этот вопрос или в какой-то мере интересуется этой темой: я нашел действительно отличную рецензию на текущее состояние доступных инструментов для этой работы]
select
для мультиплексирования ввода / вывода. Но вы должны быть в состоянии получить достойную производительность из этого с торнадо-пьюв . 2. В Python 3.3+ и его троллее backport теперь есть asyncio, который позволяет запускать любое приложение Tornado в цикле событий (Twisted будет поддерживаться в ближайшее время).