@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 ничего не знает об асинхронности.
  • Вопрос задан
  • 702 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Заверни асинхронный коллбэк в синхронную обёртку (можно лямбду), которая вызывает asyncio.create_task() для целевой корутины, и передавай эту обёртку как коллбэк.
Если же ты контролируешь func2, то ещё проще, вставь вызов create_task() туда.
Вот если нужно дождаться результата выполнения, то будет сложнее - но можно засунуть обработку результата в асинхронную часть.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы