Развёрнутое пояснение:
1. asyncio.run запускает цикл событий и начинает выполнять main.
2. Первый вызов create_task планирует задачу db, но send ещё не начинает исполняться, поскольку main пока не передал управление циклу событий.
3. Второй вызов create_task аналогично планирует задачу log.
4. На await db функция main приостанавливается, и цикл событий запускает запланированные задачи в порядке их постановки.
5. Задача db печатает send db и приостанавливается на asyncio.sleep(0).
6. Затем задача log печатает send log и тоже приостанавливается.
7. После завершения db ожидание в main заканчивается, и main печатает saved. Поэтому строки выводятся в порядке send db, send log, saved.
Почему это важно: create_task запускает конкурентную задачу при ближайшей передаче управления циклу событий. Ожидание одной задачи не мешает другим уже запланированным задачам начать работу, что важно учитывать при отправке данных, обновлении метрик и обработке очередей.
Post #4891
149
Python: задачки и вопросы
- ✍ 2