#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 и не изменяет его поведение, этот таинственный код компании звучит действительно интересно — жаль, что это что-то не может быть обнародовано публично!