Как вызвать асинхронную функцию?
Сам код:
async def get_app():
app_info = await _bot.application_info()
return app_info
При простом вызове get_app() я получаю генератор, если использовать await, то выдаёт ошибку SyntaxError: 'await' outside function, если делать вызов через asyncio.run(get_app()) выдаёт ошибку RuntimeError: asyncio.run() cannot be called from a running event loop.
p.s. хочу вернуть значение app_info
Ответы (1 шт):
Судя по ошибкам, Вы запускаете get_app из синхронного колбэка асинхронного сервера. Иначе работало либо через первый, либо черезвторой способы.
Из колбэка получить результат можно только в новый колбэк. привет яваскрипт ;)
def second_cb(fut):
app_info = fut.result()
продолжение кода
def server_cb(request):
asyncio.ensure_future(get_app()).add_done_callback(second_cb)
return
second_cb выполнится после завершения server_cb.
Чтоб избежать callback-hell перевызывай server_cb как асинхронную функцию и делай там await-ы
def server_cb(request):
async def server_cb_async(request):
r = await get_app()
r2 = await another(r)
# вся обработка вложенна тут...
asyncio.ensure_future(server_cb_async(request)).add_done_callback(lambda x: pass)
или запустить асинхронный вариант как таск
asyncio.get_running_loop().create_task(server_cb_async(request))
В последнее время я через таски делаю.
Как альтернативный вариант можно использовать готовую джанговскую async-to-sync
from asgiref.sync import async_to_sync
res = async_to_sync(get_app())
или
@async_to_sync
async def get_app(...):