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: возможно, интересный для любого, кто следил или наткнулся на этот вопрос или заботился об этой теме в любом смысле: я нашел действительно отличную запись текущего состояния доступные инструменты для этой работы]