3FANG,
насчёт твоего второго вопроса: всё предельно просто. Ты запустил 10 копий корутины, они все выполнили
print('start')
и ушли в спячку на две секунды - практически одновременно!
Точнее, первая корутина встала в очередь, create_task() закончила свою работу и вернула управление в твой цикл запуска корутин. И так 10 раз. Все корутины стоят в очереди плотно друг за другом.
Затем ты входишь в цикл ожидания корутин, пишешь в консоль "старт", дожидаешься первой корутины, при этом main() встаёт в очередь на вызов. Первая корутина запустилась, написала start, и ушла в ожидание. Следующая в очереди готова вторая корутина. Она запустилась, написала start, ушла в ожидание. И так далее. В конце main() снова оказывается в начале очереди - но она ждёт первую корутину, она ещё не готова выполняться. Она отправляется в конец очереди. Поэтому программа ждёт первую корутину, но ожидание-то тикает у всех!
Тогда первая корутина отработала - но прежде чем ты вернёшься из await-вызова в main(), сначала успеют отработать всё стоящие в очереди корутины, потому что их время тоже подошло, и они стоят в очереди раньше! И ты видишь последовательность start-finish внутри корутин.
Затем очередь вызова доходит до main() и ты видишь "финиш" ожидания первой корутины. Ты начинаешь ждать вторую (старт) - но она уже отработала, поэтому main() единственная в очереди, и она тут же получает управление обратно (финиш). И так с оставшимися корутинами.
Если ты сделаешь так, чтобы каждая следующая копия корутины ждала дольше предыдущей, то ситуация будет интереснее:
кодimport asyncio
from time import time, sleep
async def waste_time(i, delay):
print(f"Start work {i}...")
await asyncio.sleep(delay)
print(f"End work {i}!")
async def main():
tasks = []
for i in range(10):
task = asyncio.create_task(waste_time(i+1, (i+1)*1.0))
tasks.append(task)
for i, task in enumerate(tasks, 1):
print(f'start wait {i}')
await task
print(f'end wait{i}')
if __name__ == '__main__':
start = time()
asyncio.run(main())
print(time() - start)
выводstart wait 1
Start work 1...
Start work 2...
Start work 3...
Start work 4...
Start work 5...
Start work 6...
Start work 7...
Start work 8...
Start work 9...
Start work 10...
End work 1!
end wait1
start wait 2
End work 2!
end wait2
start wait 3
End work 3!
end wait3
start wait 4
End work 4!
end wait4
start wait 5
End work 5!
end wait5
start wait 6
End work 6!
end wait6
start wait 7
End work 7!
end wait7
start wait 8
End work 8!
end wait8
start wait 9
End work 9!
end wait9
start wait 10
End work 10!
end wait10
10.012470483779907