loop.run_until_complete(g) получил ошибку asyncio.Будущее, требуется сопрограмма или ожидаемое

#python #python-asyncio

#питон #python-asyncio

Вопрос:

Следующий сценарий

 import asyncio  async def f(x):  print(f'test {x}')  raise Exception('error...')  g = lambda: f('x') print(type(g)) loop = asyncio.get_event_loop() loop.run_until_complete(g) # error, change g to f also got the error  

появилась следующая ошибка,

 TypeError: An asyncio.Future, a coroutine or an awaitable is required  

Попробовал позвонить loop.run_until_complete() с обоими g f и получил ту же ошибку?

Комментарии:

1. Вам нужно вызвать свою лямбду , чтобы получить сопрограмму loop.run_until_complete(g()) , в данный момент вы просто передаете функцию run_until_complete

2. Да, сменил на g() работает. Однако я скопировал сценарий из производственного кода, который работает. Очень странно. Кстати, почему loop.run_until_complete(f )` не работает? Разве f это уже не сопрограмма?

3. Асинхронные функции не являются сопрограммами, пока вы их не вызовете, точно так же, как функции генератора не являются генераторами, пока вы их не вызовете. Они должны быть инициализированы (вызваны), прежде чем вы сможете их дождаться

Ответ №1:

 gt;gt;gt; async def a(): ... pass ...  gt;gt;gt; a lt;function a at 0x0000022F70FEA3B0gt;  gt;gt;gt; a() lt;coroutine object a at 0x0000022F7100A2D0gt;  

Точно так же, как генераторы, как сказал Лейн Шелвингтон, сопрограммы не являются сопрограммами, пока их не вызовут.

Но в случае, если ваша компания использует другие параллельные библиотеки, это может отличаться. Какую библиотеку использует ваша компания?

 import trio import anyio import curio import asyncio   async def f():  print("run")  trio.run(f) anyio.run(f) curio.run(f) asyncio.run(f)  
 run run run Traceback (most recent call last):  File "C:UsersjupiterbjyAppDataRoamingJetBrainsPyCharm2021.3scratchesscratch.py", line 13, in lt;modulegt;  asyncio.run(f)  File "C:Program FilesPython310libasynciorunners.py", line 37, in run  raise ValueError("a coroutine was expected, got {!r}".format(main)) ValueError: a coroutine was expected, got lt;function f at 0x000001816CE9E200gt;  

Комментарии:

1. Моя компания использует asyncio и tornado. Может быть, Торнадо изменил поведение?

2. Насколько я знаю, он не исправляет asyncio и не изменяет его поведение, этот таинственный код компании звучит действительно интересно — жаль, что это что-то не может быть обнародовано публично!