В asyncio
мире каждая сопрограмма может быть выполнена либо внутри другой сопрограммы (с использованием await
), либо с помощью вызова блокировки цикла событий (с использованием run_until_complete()
).
Вы не можете ожидать сопрограммы внутри обычной функции, так как вызов этой функции будет блокировать, в то время как ожидание сопрограммы требует блокировки выполнения цикла события. Вот как asyncio
предназначен для работы.
Если вы согласны с представлением о блокировке вашей call()
функции и имеете доступ к реализации f()
, вы можете выполнить сопрограмму внутри f()
цикла событий runnning:
async def af(.):
...
def f(.):
loop = asyncio.get_event_loop()
return loop.run_until_complete(af())
def call(.):
..Some sync code..
try:
resp = f(..)
...some more transformations of resp...
return ..
except:
..Some error handling..
Если у вас нет доступа к реализации f()
, я не верю, что вы могли бы изменить call()
для ожидания сопрограмм (без каких-либо уродливых исправлений обезьян).
Я думаю, что перезапись call()
в асинхронный режим будет только хорошим вариантом.