Код: Выделить всё
asyncПоэтому я ищу функцию запуска со следующей сигнатурой:
Код: Выделить всё
def run(coro: Coroutine[Any, Any, _ReturnT]) -> _ReturnT: ...
Код: Выделить всё
run1 = asyncio.run
Код: Выделить всё
def sync_f():
return run(async_f())
Чтобы увидеть это, представьте, что другой модуль (синхронизации) построен на sync_f, чтобы сделать другие синхронные вещи:
Код: Выделить всё
def sync_g():
print("Doing some synchronous things")
res = sync_f()
print("Doing some other synchronous things")
return res
Код: Выделить всё
async def async_h():
print("Doing some asynchronous things")
res = sync_g()
print("Doing some other asynchronous things")
return res
Я пытался быть немного умнее с моим определением запуска, пытаясь увидеть, в настоящее время выполняется цикл более высокого уровня, и выполняется мой сопрограмма в этой:
Код: Выделить всё
def run2(coro: Coroutine[Any, Any, _ReturnT]) -> _ReturnT:
try:
loop = asyncio.get_running_loop()
except RuntimeError:
return asyncio.run(coro)
else:
return loop.run_until_complete(coro)
Это имеет смысл, но я не смог найти что-то, что использовало бы текущий запуск (что-то вроде цикла.wait_until_complete(coro)).
Нет ли способа обернуть асинхронную функцию в обычную, которая будет работать точно так же, как синхронная, без подробностей реализации асинхронная версия просачивается в более высокие контексты?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ronous-one
Мобильная версия