Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Я не люблю asyncio

Я не люблю asyncio

Павел Камаев ("Лаборатория Касперского") @ MoscowPython Meetup 53
"Самое крупное нововведение в Python за последние годы — это, конечно, асинхронный фреймворк asyncio. Основной вопрос, который задают себе все разработчики в связи с его выходом, — а насколько он готов к использованию? В этом докладе я хочу поделиться своим опытом работы с asyncio и его экосистемой в Python.

Немного о себе. Занимаюсь асинхронным переводом с менеджерского на питоний последние четыре года. Сеньор, тролль, веб-девелопер. Люблю микролиты и моносервисы, держу дома кита Докера, кролика Эмку и работника зоопарка из племени апачей".
Видео: http://www.moscowpython.ru/meetup/53/I-dont-like-asyncio/

Moscow Python Meetup
PRO

February 22, 2018
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Я люблю НЕНАВИЖУ asyncio
    Доклад
    учени__ __ класса __
    Камаева Павла

    View Slide

  2. Переезд с Django на async

    View Slide

  3. Переезд с Django на async
    Технологический стэк
    nginx nginx
    uWSGI circusd
    redis redis
    PostgreSQL PostgreSQL

    View Slide

  4. Переезд с Django на async
    Библиотеки
    Django aiohttp
    jinja2 jinja2 + aiohttp_jinja2
    Django ORM peewee + peewee-async
    psycopg2 aiopg/asyncpg

    View Slide

  5. Переезд с Django на async
    Библиотеки для разработчика
    django-debug-toolbar aiohttp-debug-toolbar
    autoreload aiohttp-autoreload
    shell_plus aioconsole

    View Slide

  6. Dependency hell

    Промежуточная вспомогательная бибилиотека
    – my_package → my_helpers → aiohttp < 1.0
    – my_package → aiohttp_jinja2 → aiohttp >= 0.18

    Мейнтейнеры aiohttp разделяют и властвуют
    – aiohttp < 2.0 → yarl >= 0.8
    – aiohttp == 2.2 → yarl >= 0.11

    pipenv ???

    View Slide

  7. Все любят микросервисы!

    View Slide

  8. Все любят микросервисы!

    … NoSQL

    … очереди сообщений

    … динамическое конфигурирование

    View Slide

  9. Усредненный рецепт

    ElasticSearch

    Apache Cassandra / MongoDB

    Apache Kafka / RabbitMQ

    Apache Zookeeper / Consul / etcd

    View Slide

  10. from db.nosql import elasticsearch

    View Slide

  11. from db.nosql import cassandra

    2014-03-16 — python 3.4, provisional asyncio API

    2016-03-03 — DataStax PYTHON-507 CREATED

    2016-06-27 — python 3.5.2, incompatible API changes(asynchronous iterators)

    2016-12-23 — python 3.6, stable asyncio API

    2017-01-29 — aiocassandra 0.0.1

    2017-03-09 — aiocassandra 1.0.3

    2017-12-07 — DataStax PYTHON-841 IN PROGRESS

    2018-01-29 — DataStax PYTHON-841 RESOLVED

    2018-02-09 — aiocassandra 1.1.0

    View Slide

  12. from db.nosql import mongodb

    Синхронный драйвер: pymongo

    Асинхронный драйвер: motor

    Минутка истории(до 2016-10):

    > pip install 'motor==0.6'

    Collecting motor==0.6

    Collecting greenlet>=0.4.0 (from motor==0.6)

    Using cached greenlet-0.4.12-cp36-cp36m-manylinux1_x86_64.whl

    Collecting pymongo==2.8.0 (from motor==0.6)

    Installing collected packages: greenlet, pymongo, motor

    Successfully installed greenlet-0.4.12 motor-0.6 pymongo-2.8

    View Slide

  13. from message_queues import rabbitmq

    pika
    –поддержка asyncio с 0.11.0
    – AsyncioAdapter предоставляет интерфейс с callback

    aio-pika
    – выросла из PR в pika с AsyncioAdapter
    – имеет собственную версию rabbimq tutorial(адаптация официального)
    – пока не поддерживает pika > 0.10

    aioamqp
    – не умеет отправлять сообщения с пустым телом
    – в вечном цикле обрабатывает фреймы в рамках одного подключения
    – некорректно работает с unicode

    asynqp
    – publish синхронный

    View Slide

  14. from message_queues import rabbitmq

    View Slide

  15. from message_queues import kafka

    aiokafka
    – поддерживает интерфейс async for
    – consumer разбит на 2 части: fetcher и
    непосредственно интерфейс consumer.
    fetcher не управляется пользователем.

    View Slide

  16. import configuration

    Consul

    etcd

    Apache Zookeeper

    View Slide

  17. from configuration import consul
    Название Последняя версия Дата релиза Поддержка asyncio
    consulate 0.6.0 2015-07-22 −
    consul-kv 0.7.3 2017-09-03 −
    python-consul 0.7.2 2017-08-26 +

    View Slide

  18. from configuration.consul import python-consul

    Магия генераторов
    – нечитаемые интерфейсы(нет декоратора coroutine)
    – сложно/невозможно использовать сложные
    рецепты

    Нет продвинутых рецептов
    – распределенные блокировки
    – выборы лидера

    View Slide

  19. from configuration import zookeeper
    Название Последняя версия Дата релиза Поддержка asyncio
    pookeeper — 2013-01-01 :)
    zc.zk 2.1.0 2014-10-20 −
    kazoo 2.4.0 2017-06-14 −
    aiozk 0.5.3 2017-09-22 +

    View Slide

  20. from configuration.zookeeper import aiozk

    порт zoonado на asyncio

    сырой
    – print в коде
    – нет обработки некоторых сетевых ошибок

    нет коммьюнити

    View Slide

  21. import testing

    pytest: pytest-asyncio

    unittest: asynctest
    – до 0.11.0 не было поддержки async with в mock

    nose: DEAD

    nose2: ???

    View Slide

  22. Я ЛЮБЛЮ asyncio

    2016-12-23 — python 3.6.0, asyncio API объявлено
    стабильным

    Большинство технологий имеют библиотеки для
    работы с ними из асинхронных приложений

    Коммьюнити активно начинает использовать
    asyncio, поддерживает разные библиотеки

    View Slide

  23. Вопросы
    Докладчик: Камаев Павел

    View Slide