Долго пугался слова «асинхронность», воображал страшный параллельный мир. Никак не давалась связка async/await — как будто магия. Пока однажды не прочитал простое: пока мы ждём ответ от сети или базы (input/output), процессор свободен, и можно позвать следующую задачу. Весь async — про то, чтобы не простаивать в ожидании.

Нейтрально: async позволяет стартовать ожидание и заниматься другим делом, а await — «подождать завершения вот этого». Отлично для сети/файлов, но не ускорит «просто сложные вычисления».

import asyncio

async def fetch_one(user_id):
    # имитация долгого запроса (сеть/БД)
    await asyncio.sleep(1)          # здесь — ожидание, процессор свободен
    return user_id * 10

async def main():
    # запускаем несколько запросов «параллельно» по ожиданию
    results = await asyncio.gather(fetch_one(1), fetch_one(2), fetch_one(3))
    print(results)                  # [10, 20, 30]

asyncio.run(main())

Когда понял «асинхронность — про ожидание ввода-вывода, а не про магическое ускорение циклов», мир стал проще. Теперь слова async/await из расчёта читаю спокойно — понимаю, когда их применяют (сеть), а когда они лишние.