1️⃣Определены функции 𝚏𝚎𝚝𝚌𝚑 и 𝚖𝚊𝚒𝚗, но они ничего не делают сами по себе, пока не будут запущены через await/цикл событий.
2️⃣Строка 𝚌𝚘𝚛𝚘 = 𝚖𝚊𝚒𝚗() создаёт объект‑корутину 𝚌𝚘𝚛𝚘; тело 𝚖𝚊𝚒𝚗 (и, следовательно, 𝚏𝚎𝚌𝚝𝚌𝚑) при этом не исполняется.
3️⃣Вызов 𝚌𝚘𝚛𝚘.𝚌𝚕𝚘𝚜𝚎() корректно завершает корутину, что предотвращает предупреждение «coroutine was never awaited»; метод 𝚌𝚕𝚘𝚜𝚎 доступен у корутин по спецификации.
4️⃣Поскольку ни 𝚖𝚊𝚒𝚗, ни 𝚏𝚎𝚌𝚑 не выполнялись, строки "fetching" и "done" не печатаются; затем исполняется обычный синхронный 𝚙𝚛𝚒𝚗𝚝("after") и выводит единственную строку.
Как работает async/await
Асинхронное программирование позволяет программе не простаивать во время долгих операций (сеть, диск, база данных). Ключевое слово 𝚊𝚜𝚢𝚗𝚌 превращает функцию в корутину — объект, который можно «приостановить» на await и потом продолжить, при этом цикл событий в момент ожидания переключается на другие задачи. Для реального запуска корутины нужен либо 𝚊𝚠𝚊𝚒𝚝 внутри другой async‑функции, либо явный вызов через 𝚊𝚜𝚢𝚗𝚌𝚒𝚘.𝚛𝚞𝚗() или цикл событий.
Подробнее про основы асинхронности в Python и чуть глубже о том, почему мало кто на самом деле понимает как это работает.
Post #4503
778
- 👍 5
- 🔥 3