пятница, 27 июня 2014 г.

aiohttp client для Sentry

Полагаю, многие используют Sentry для мониторинга ошибок в своих проектах.
Мне тоже захотелось.
Sentry для Python предоставляет библиотеку под названием raven чтобы ваш код мог слать сообщения на Sentry server.

Была проблема: код наших рабочих проектов использует asyncio и основанные на этой штуке библиотеки.
Делать синхронные HTTP вызовы в асинхронном коде нехорошо -- это очень плохо влияет на производительность.

Сегодня нужный Pull Request вошел в raven-python master.
DSN для aiohttp транспорта должен быть вида:
aiohttp+http://10797b99a237420b874b7be422a715f8:4b5a65ea48bf43c0811ff473d0ae8563@sentry.project.com/2

Ждите следующего релиза raven-python (или пользуйтесь git master на свой страх и риск :)

пятница, 20 июня 2014 г.

aiohttp войдет в FreeBSD ports

Библиотека aiohttp предназначена для поддержки HTTP протокола в asyncio -- новом стандарте (PEP 3156: Asynchronous IO Support Rebooted: the "asyncio" Module) и эталонной реализации асихронного сетевого программирования для Python.

aiohttp состоит из клиентской (HTTP запросы) и серверной (HTTP сервер) частей.

HTTP клиент довольно хорош, умеет обрабатывать redirects, cookies, HTTP proxies и много чего еще.

Состояние дел с HTTP сервером немного хуже. Т.е. он вполне рабочий, умеет делать keep-alive, gzip compression, chunked encoding и web-sockets. Проблема в том что HTTP сервер слишком низкоуровневый, нужно написать немало кода чтобы отдать простой html response.
Мы работаем над более высокоуровневым API.

И, прошу прощения, документация отсутствует (мы тоже работаем над этой проблемой). Примеры использования есть, а документации пока нет.

Так вот, aiohttp уже добавлена в FreeBSD ports git repo (когда выйдет релиз новых портов -- не знаю).
Мелочь, а приятно.

К слову, в Gunicorn 19.0 появился новый gaiohttp worker который, как не трудно догадаться, написан на базе aiohttpпост на эту тему.

В общем, двигаемся не так быстро как нам хотелось бы -- но работа идет. И есть надежда, что к концу лета напишем документацию и предоставим хороший высокоуровневый Server API.


понедельник, 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 подобные хотелки уже были.

среда, 4 июня 2014 г.

Итоги PyCon RU

Вернулся из Екатеринбурга с pycon.ru
Всё прошло замечательно.

  • Прекрасное место в сосновом лесу (воздух там пахнет восхитительно).
  • Хорошая организация мероприятия. Девочки из IT People уже второй раз показывают очень высокий класс -- накладок практически не было.
  • Пара интересных заманух: впервые увидел 3D принтер в работе и попробовал очки виртуальной реальности -- картинка гадостная, но действует на мозг мощно... Я понимаю что это только видео, но тело само пытается реагировать. Если бы не поддерживали -- упал бы точно. А так просто сильно вспотел, стоя на месте.
  • Доклады. Те, на которые попал -- послушал с интересом. Может, были и неудачные -- не знаю, не видел. Впрочем, видел далеко не всё.
  • Вечерний (или, точнее, ночной) костер был суперской идеей.
  • Немного досаждали комары -- но и те, проявляя деликатность, поедом не ели.
  • Хотелось бы посетить больше интересных мне докладов -- но они или пересекались с другими не менее интересными, или просто очень хотелось спать: ночной костер был прекрасен и уходить решительно не хотелось.
Очень удачно, что доклад Андрея Власовских был в расписании перед моим.
Андрею задали столько вопросов по asyncio (на которые он часто отвечал: завтра услышите от Светлова) -- что я был вынужден сильное скорректировать план своей лекции. Надеюсь, у меня вышло более или менее неплохо. Похоже, asyncio интересна довольно большой части питоновского сообщества -- что меня радует.


Самое главное -- получилось интересно поболтать ребятами и девчонками.
Каких-то собеседников увидел впервые.
Других -- знаю уже много лет, но увидеть вживую могу только примерно раз в год на конференциях вроде этой.
И это очень классно: не переписываться а просто поговорить!

Организаторам -- огромное спасибо. С радостью приеду на PyCon RU 2015.

Мои слайды:

P.S. Через неделю в Москве будет конференция DevConf.

Так получилось, что две конфы по Python почти совпали по времени, но оказались довольно сильно разнесены географически.

Часть докладов одни и те же.
Мне выпал второй шанс -- посещу то, что пропустил на PyCon RU: ребят из WarGaming, лекцию по Salt и Ansible, Романа Иманкулова о pytest.

Роман умееет очень интересно рассказывать о чем угодно. Я ортодоксально использую исключительно стандартный unittest и он меня не переубедит -- но послушаю с удовольствием..

Salt и Ansible тоже очень итересны мне лично.

И повторю я свои лекции. По asyncio будет немного другая -- с учетом тех вопросов, которые мне задавали слушатели после выступления.
"Рецепты по написанию хорошей библиотеки" не изменятся -- выстрадано, продуманно, подкреплено опытом.

И, к тому же, формат DevConf немного другой -- больше времени и меньше аудитория.
Поэтому я опять попробую форму изложения, лучше подходящую для DevConf: 
  • Я рассказываю без микрофона (зал достаточно мал)
  • Если возникает непонятка -- не ждите конца лекции а поднимите руку (правую или левую, мне без разницы), чтобы я заметил. 
  • После этого громко (микрофона нет) задайте вопрос -- я отвечу.
  • Доклад будет скомпонован так, чтобы показать самые важные вещи в начале, -- и даже если я не успею рассказать "хвост", -- ничего страшного не произойдёт. 
  • Поэтому -- не стесняйтесь задавать вопросы.
В общем, думаю, идею все поняли.