Задать вопрос
@centum

Python: Как вызвать асинхронную функцию из синхронной при действующем event loop?

Есть стэк вызова функций:
[main async func0] -> [sync func1] -> [sync func2] -> [async func3]


Как вызвать async func3 из func2 если func1 ничего не знает о асинхронности?
func2 передается в func1, как реализация интерфейса.

Если делать так:
from asgiref.sync import async_to_sync

def func2():
  result = async_to_sync(func3)()

то получаем ошибку:
RuntimeError: You cannot use AsyncToSync in the same thread as an async event loop - just await the async function directly.

Но я не могу вызвать напрямую через await, т.к. func1 ничего не знает об асинхронности.
  • Вопрос задан
  • 1003 просмотра
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillfactory
    Профессия Python-разработчик
    9 месяцев
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Заверни асинхронный коллбэк в синхронную обёртку (можно лямбду), которая вызывает asyncio.create_task() для целевой корутины, и передавай эту обёртку как коллбэк.
Если же ты контролируешь func2, то ещё проще, вставь вызов create_task() туда.
Вот если нужно дождаться результата выполнения, то будет сложнее - но можно засунуть обработку результата в асинхронную часть.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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