понедельник, 9 июня 2014 г.

asyncio, aiohttp и gunicorn

Многие WSGI сайты используют gunicorn для развертывания.

Это прекрасно работает для python 2, но для python 3 есть проблема: наиболее употребляемые gunicorn workers, -- использующие gevent и enentlet, -- не заводятся под "тройкой" потому что gevent c eventlet все еще не портированы.

Автор gunicorn Бенуа Шесно начал было писать новый asyncio worker -- но быстро увидел что работы предстоит сделать немало, а в aiohttp Николай Ким уже написал всё что нужно.

Коротко говоря aiohttp.worker переехал в gunicorn.workers.gaiohttp вместе со своими тестами, вышел новый релиз aiohttp 0.8, а мы с Колей стали commiters в gunicorn.

Бенуа планирует выпустить новый релиз gunicorn к концу недели.

К сожалению aiohttp 0.8 ломает обратную совместимость -- так было нужно.
Зато теперь он имеет более чистый API: использует multidict для HTTP headers в клиентском и серверном коде вместо причудливой смеси разных подходов, привносящих в public API методы, которые было небезопасно использовать.
Плюс переработана иерархия исключений и еще кое-какие приятные мелочи вроде более внятных сообщений об ошибках -- полный список изменений здесь.
Это еще один шаг к тому, чтобы сделать aiohttp максимально удобной для простого программиста.

К слову, при использовании gaiohttp gunicorn worker можно делать странные вещи: запускать асинхронно asyncio.Task из вьюхи на Django, например. Как это делают для gevent/eventlet worker.
Мне такой гермафродит не нравится по эстетическим соображениям, но запретить стрелять себе в ногу я не в силах. А на stack overflow подобные хотелки уже были.