Два последовательных
await не дают конкурентности: вторая корутина запустится после первой. Создание двух объектов корутин тоже не планирует их выполнение. Для этого нужны задачи, созданные до первого ожидания.У каждого способа свои гарантии.
gather() возвращает результаты в порядке аргументов. Если одна задача выбрасывает исключение, оно передаётся вызывающему коду сразу, а остальные задачи продолжают работать. as_completed() отдаёт результаты по мере готовности. wait() делит задачи на завершённые и ожидающие, а его тайм-аут сам ничего не отменяет.В статье Waiting in asyncio автор советует начинать с
TaskGroup, а для более гибкого управления выбирать wait(). Здесь «явное лучше неявного» работает буквально.
