Comments 18
полтора года использования в продакшене

Расскажите подробнее, немного информации об асинхронном питоне в продакшене.
Облачный сервис с бэкэндом на Django. И сбоку около 10 микросервисов так или иначе использующий asyncio. Некоторые взаимодействуют с другими сервисами комнании по http, также много работы с s3, Redis, Kafka. Проект пока не назовешь очень уж большим, но мы растем. К сожалению, больше рассказать про внутренее устройство системы не могу, сами понимаете.
А в сторону django channels не смотрели? Имеет ли смысл использовать?

Не понял ваш пример с "примитивами синхрнизации", не вижу места где force_flash вызывается.

Это просто пример реализации. Можно использовать где угодно — зависит от логики вашего приложения.
Asyncio появился в Pyhton версии 3.4
Но можно было использовать с python 3.3 (как внешнюю либу)

за пул всего в 5 потоков будут конкурировать ваши синхронные операции, плюс все кому надо сделать getaddrinfo(). Выход — использовать свой пул. Всегда:
Так же можно использовать асинхронный http клиент + json dns api.
Если бы dns был нужен только для интернета… И кстати: кто будет резолвить адрес dns.google.com, для того чтобы отправить туда запрос?
UFO landed and left these words here

В примере по пул потоков при запуске скобки после blocking_function не лишние?
И, вроде бы, число потоков по умолчанию не 5, а по 5 на каждой процессор.


Поправьте, если ошибаюсь.

Спасибо, поправил. По поводу пула: в python 3.5.2 в asyncio.base_events еще есть константа _MAX_WORKERS=5. В upstrem как я виже это уже пофикшено, но свой пул актуален для всего что < 3.5.2

Функции фабрики удобно делать @classmethod'ами


async def create_foo(loop):
    reader, writer = await asyncio.open_connection('127.0.0.1', 8888, loop=loop)
    return Foo(reader, writer, loop)

превращается в


@classmethod
async def create(cls, loop):
    reader, writer = await asyncio.open_connection('127.0.0.1', 8888, loop=loop)
    return cls(reader, writer, loop)

красивее и работает с наследованием

Да, такой метод есть. Тут уже дело вкуса: мне больше нравятся функции-фабрики. К тому же такой подход более распространен в сообществе.
Немного воскрешу тему вопросом: а можно ли сделать такую конструкцию:
async def __getattr__(self, name):
    pass

И как ее вообще использовать можно?
Обсуждать целесообразность здесь не стоит, а вот необходимость может быть, например, когда мы хотим внутри __getattr__ выполнить вызов функции, объявленной как async.
С asyncio можно await'ить не async функции, и наоборот — внутри не async ф-ии вызывать с «ожиданием» async функцию. Так что даже если такая конструкция не компиллируется, то способ сделать задуманое есть.
Only those users with full accounts are able to leave comments. Log in, please.