Познакомимся с основными функциями asyncio, которые часто встречаются на практике:- gather — выполняет список корутин одновременно и дожидается результата выполнения всех корутин.
- sleep — заставляет корутину уснуть на определённое количество секунд.
- wait/wait_for — удобные функции, чтобы дождаться выполнения уже запущенной корутины.
Также стоит ознакомиться с основными функциями для работы с event_loop:- get_event_loop — получить новый объект event_loop или тот, что уже существует. При этом одновременно может существовать только один объект event_loop в рамках одного потока.
- run_until_complete/run — удобные функции для запуска и проверки асинхронных функций.
- shutdown_asyncgens — одна из самых недооценённых функций цикла событий, которая позволяет правильно завершить выполнение цикла событий и всех корутин.
- call_soon — позволяет запланировать выполнение корутины, но не ждать её выполнения. Таким образом можно вечно ставить на выполнение одну и ту же функцию.
Теперь стоит поговорить про ключевые различия между
asyncio и предложенной реализацией цикла событий.
Asyncio работает на функциях обратного вызова или колбэках (callback). Этот механизм запускает задачи «честнее», чем текущий планировщик. Каждая корутина по-честному ставится в очередь и исполняется. В простом планировщике переключения не произойдёт, пока вся цепочка корутин не выполнится, что блокирует выполнение остальных задач. Однако, у колбэков есть и свой недостаток — callback hell. Это состояние, когда после вызова каждой функции нужно вызвать ещё одну функцию и ещё одну функцию… Получаются интересные фрагменты кода: