@DellDeniel

Можно ли внутри асинхронных функций запускать обычные?

Не совсем понимаю принципы работы асинхронных функций. Могу ли я например внутри асинхронной функции создать базу данных SQLite методом connect, которые не является асинхронным ?
  • Вопрос задан
  • 449 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Да, можно, если они кратковременные.

Идея асинхронности в питоне проста как две копейки: асинхронные функции выполняются в рамках однопоточного рабочего цикла (loop), и умеют сказать ему "когда вот эта операция закончится - продолжи выполнять меня. А пока займись чем-нибудь" (await-вызов).

Соответственно, пока асинхронная функция выполняет синхронный код, т.е. код между await'ами (ну и началом/завершением в т.ч.), рабочий цикл не может выполнять никакую другую асинхронную функцию. Это плюс, так как не приходится беспокоиться из-за одновременного доступа, как при работе через потоки. Но минус в том, что долгие синхронные операции не позволяют циклу выполнять другие асинхронные функции, т.е. реагировать на внешние события.

Отсюда вывод: если твой синхронный код выполняется быстро - его можно вызывать из асинхронных функций без проблем. Если это длительный (блокирующий) код - его либо нужно заменить асинхронным, либо засунуть в отдельный поток с помощью run_in_executor(), либо на худой конец разбавить вызовами await asyncio.sleep(0). Такой вызов просто возвращает управление в рабочий цикл, чтобы тот мог разобраться с текущими делами, а потом вернуться и продолжить выполнение этой асинхронной функции.

Обращения к БД на малых объёмах и малых нагрузках не слишком длительны. Если очень надо, есть асинхронный aiosqlite.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы