Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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 ???

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Все любят микросервисы! ● … NoSQL ● … очереди сообщений ● … динамическое конфигурирование

Slide 9

Slide 9 text

Усредненный рецепт ● ElasticSearch ● Apache Cassandra / MongoDB ● Apache Kafka / RabbitMQ ● Apache Zookeeper / Consul / etcd

Slide 10

Slide 10 text

from db.nosql import elasticsearch

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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 синхронный

Slide 14

Slide 14 text

from message_queues import rabbitmq

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

import configuration ● Consul ● etcd ● Apache Zookeeper

Slide 17

Slide 17 text

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 +

Slide 18

Slide 18 text

from configuration.consul import python-consul ● Магия генераторов – нечитаемые интерфейсы(нет декоратора coroutine) – сложно/невозможно использовать сложные рецепты ● Нет продвинутых рецептов – распределенные блокировки – выборы лидера

Slide 19

Slide 19 text

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 +

Slide 20

Slide 20 text

from configuration.zookeeper import aiozk ● порт zoonado на asyncio ● сырой – print в коде – нет обработки некоторых сетевых ошибок ● нет коммьюнити

Slide 21

Slide 21 text

import testing ● pytest: pytest-asyncio ● unittest: asynctest – до 0.11.0 не было поддержки async with в mock ● nose: DEAD ● nose2: ???

Slide 22

Slide 22 text

Я ЛЮБЛЮ asyncio ● 2016-12-23 — python 3.6.0, asyncio API объявлено стабильным ● Большинство технологий имеют библиотеки для работы с ними из асинхронных приложений ● Коммьюнити активно начинает использовать asyncio, поддерживает разные библиотеки

Slide 23

Slide 23 text

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