Блокировка нескольких асинхронных вызовов
Мой код:
import asyncio
async def test(i):
await asyncio.sleep(i)
print('test')
async def main():
await test(2)
await test(2)
await test(2)
asyncio.get_event_loop().run_forever(main())
Я ожидал, что он будет спать в течение трех секунд, а затем распечатает 'test' три раза, но вместо этого он ждет 2 секунды, прежде чем каждый 'test' отдельно (так что последний 'test' печатается через 6 секунд).
Что я понял неправильно, и как я могу исправить это, чтобы работать, как я ожидал?
1 ответ:
awaitприостанавливает выполнение текущей функции до тех пор, пока не вернется будущее. Вtest, это заставляет функцию ждать в течение 2 секунд, покаasyncio.sleepне вернется, прежде чем печатать. Вmainон заставляет функцию ждать, покаtestне вернется (что она делает послеsleepвозвратилась), прежде чем продолжить на следующей строке со следующимawait test.Если вы хотите выполнить все
testодновременно и заставить их печатать одновременно через две секунды, вы можете используйтеasyncio.gather:async def main(): await asyncio.gather(test(2), test(2), test(2))Это планирование трех
testсопрограмм в цикле событий одновременно и ожидает всех их Объединенных результатов, которые прибудут через ~2 секунды.Вы также можете стрелять и забыть о сорутинах, не дожидаясь их завершения:
def main(): asyncio.ensure_future(test(2)) asyncio.ensure_future(test(2)) asyncio.ensure_future(test(2))