Нещодавно я писав веб-павук, який багатопотоково читав, щоб одночасно виникати одночасні запити. Це було в моїй Python-молодості, за дні, перш ніж я знав про GIL і пов'язані з цим неприємності для багатопотокового коду (IE, більшість часу речі просто закінчуються серіалізованими!) ...
Я хотів би переробити цей код, щоб зробити його надійнішим та кращим. В основному я можу це зробити: я міг би використовувати новий модуль багатопроцесорної обробки в 2.6+ або міг би розібратися в реальній / подійній моделі на зразок якогось типу. Я вважаю за краще зробити пізніше, оскільки це набагато простіше і менш схильне до помилок.
Тож питання стосується того, яка рамка найкраще відповідає моїм потребам. Далі наведено список варіантів, про які я знаю дотепер:
- Скручений : дідусь із реакторних каркасів Python: здається складним і трохи роздутим. Крута крива навчання для невеликого завдання.
- Eventlet : Від хлопців з lindenlab . Рамка на базі Greenlet, орієнтована на подібні завдання. Я хоч подивився на код, і він не надто гарний: несумісний з pep8, розсипаний відбитками (чому люди роблять це в рамках !?), API здається трохи непослідовним.
- PyEv : Незрілий , здається, ніхто зараз не використовує його, хоча він заснований на libevent, тому він має надійний підхід.
- asyncore : З stdlib: über низького рівня, схоже, що багато ніжних робіт, пов'язаних просто для того, щоб щось зірвати з землі.
- tornado : Хоча це серверно-орієнтований продукт, призначений для серверних динамічних веб-сайтів, він оснащений клієнтом async HTTP та простим ioloop . Схоже, це може виконати роботу, але не те, що було призначено. [редагувати: на жаль, не працює в Windows, що для мене це рахує - це для мене вимога підтримувати цю кульгаву платформу]
Чи є щось, що я взагалі пропустив? Звичайно, там повинна бути бібліотека, яка відповідає місцем спрощеної асинхронної мережевої бібліотеки!
[редагувати: велике спасибі intgr за його вказівник на цю сторінку . Якщо прокрутити донизу, ви побачите, що існує справді приємний перелік проектів, які мають на меті вирішити це завдання так чи інакше. Насправді здається, що справи справді просунулися з моменту створення Twisted: зараз, здається, люди віддають перевагу спільному рутинному рішенню, а не традиційному, орієнтованому на реактор / зворотний виклик. Переваги такого підходу ясніше, пряміший код: я, звичайно, виявив минуле, особливо при роботі з boost.asioв C ++ цей код на основі зворотного виклику може призвести до складних конструкцій та відносно незрозумілих для нетренованого ока. Використання спільних процедур дозволяє писати код, який виглядає принаймні трохи синхронніше. Я думаю, зараз моє завдання - розібратися, яка з цих багатьох бібліотек мені подобається зовнішній вигляд, і дати їй піти! Радий, що я запитав зараз ...]
[редагувати: можливо, цікавить усіх, хто стежив за цим питанням або натрапляв на це питання чи хвилює цю тему в будь-якому сенсі: я знайшов справді чудовий опис поточного стану доступних інструментів для цієї роботи]
select
для мультиплексування вводу / виводу. Але ви повинні мати можливість отримати гідне виконання цього ефекту за допомогою торнадо-піву . 2. Зараз в Python 3.3+ є асинціо і його backport trollius, який дозволяє запускати будь-яку програму Tornado у своєму циклі подій (Twisted буде підтримано незабаром).