Некоторое время назад (давно) я написал многопоточный веб-паук, чтобы параллельные запросы выполнялись одновременно. Это было во времена моей юности, связанной с Python, еще до того, как я узнал о GIL и связанном с ним беды, которые он создает для многопоточного кода (IE, большую часть времени материал просто сериализуется!)...
Я хотел бы переработать этот код, чтобы сделать его более надежным и работать лучше. Есть два основных способа сделать это: я мог бы использовать новый многопроцессорный модуль в версии 2.6. + или я мог бы выбрать какую-то модель на основе реактора/события. Я бы предпочел сделать позже, так как это намного проще и менее подвержено ошибкам.
Таким образом, вопрос касается того, какая структура лучше всего подходит для моих нужд. Ниже приведен список опций, о которых я знаю на данный момент:
- Twisted: дедушка каркасов реакторов Python: однако кажется сложным и немного раздутым. Крутая кривая обучения для небольшой задачи.
- Ивентлет: от ребят из Линденлаб. Фреймворк на основе Greenlet, предназначенный для таких задач. Я посмотрел на код, и он не слишком красив: несовместим с pep8, разбросан отпечатками (почему люди делают это во фреймворке!?), API кажется немного непоследовательным.
- PyEv: незрелый, похоже, никто не использует его прямо сейчас, хотя он основан на libevent, поэтому у него надежный бэкенд.
- asyncore: из stdlib: über low-level, кажется, что требуется много беготни. поднять что-либо с земли.
- tornado: хотя это серверно-ориентированный продукт, предназначенный для обслуживания динамических веб-сайтов, он имеет асинхронный HTTP-клиент и простой ioloop. Похоже, он может выполнять свою работу, но не то, для чего он предназначен. [редактировать: к сожалению, не работает в Windows, что не учитывает меня - это требование для меня поддерживать эту хромую платформу]
Есть ли что-то, что я пропустил вообще? Наверняка должна быть библиотека, которая подходит для упрощенной асинхронной сетевой библиотеки!
[править: большое спасибо intgr за его указатель на эта страница. Если вы прокрутите вниз, вы увидите действительно хороший список проектов, которые так или иначе нацелены на решение этой задачи. На самом деле кажется, что с момента создания Twisted ситуация действительно изменилась: теперь люди предпочитают совместную процедуру< Решение на основе /a>, а не традиционное решение, ориентированное на реактор/обратный вызов. Преимущество этого подхода заключается в более четком и прямом коде: я определенно находил его в прошлом, особенно при работе с boost.asio в C++, код, основанный на обратном вызове, может привести к проектам, которым трудно следовать и которые будут относительно непонятны неопытному глазу. Использование сопрограмм позволяет вам писать код, который, по крайней мере, выглядит немного более синхронным. Я предполагаю, что теперь моя задача состоит в том, чтобы выяснить, какая из этих многочисленных библиотек мне нравится, и попробовать! Рад, что спросил сейчас...]
[редактировать: возможно, это будет интересно всем, кто следил за этим вопросом или наткнулся на него или интересуется этой темой в каком-либо смысле: я нашел действительно отличный отчет о текущем состоянии доступные инструменты для этой работы]
socket
является модулем C, если они позволяют GIL работать до вызова базовой процедуры, все может быть на самом деле параллельным. Тем не менее, я думаю, что хочу вернуться к чему-то однопоточному. - person jkp   schedule 01.12.2009select
для мультиплексирования ввода/вывода. Но вы сможете добиться приличной производительности с помощью tornado-pyuv. 2. Теперь в Python 3.3+ есть asyncio и его бэкпорт trollius, который позволяет запускать любое приложение Tornado в его цикл обработки событий (скоро будет поддерживаться Twisted). - person schlamar   schedule 17.01.2014