Поскольку main1
создает всех задач одновременно, а затем ожидает всех из них после их создания. Все происходит параллельно. И поэтому общее время составляет максимум всех времен, что составляет 2 с.
Пока main2
создает новое задание только после завершения предыдущего. Все происходит последовательно. Таким образом, общее время составляет сумма всех времен, которое (судя по коду) должно быть 30 с.
Редактировать: скажем, у вас есть 3 задачи: task1, task2, task3
. Если вы делаете
- создать задачу1
- Ожидание задачи1
- создать задачу2
- жду задание2
- создать задачу3
- ожидание задачи3
тогда общее время выполнения, очевидно, составляет task1.time + task2.time + task3.time
, потому что нет фоновой обработки. Поток последовательный. Теперь допустим, что вы делаете
- создать задачу1
- создать задачу2
- создать задачу3
- Ожидать задание1
- Ожидать задание2
- Ожидание задачи3
Теперь task1, task2, task3
работает в фоновом режиме . Таким образом, для обработки 4 требуется T1 = task1.time
. Но для pt 5 требуется T2 = max(task2.time - T1, 0)
для его обработки, потому что он уже работал в фоновом режиме в течение T1
времени. На pt 6 требуется T3 = max(task3.time - T2 - T1, 0)
для его обработки, потому что он уже работал в фоновом режиме в течение T1+T2
времени. Теперь некоторые математические вычисления необходимы для вычисления этой суммы T1+T2+T3=max(task1.time, task2.time, task3.time)
.
Но интуиция такова: если taskX
был самым длинным и он закончил, то все остальное закончилось из-за параллельной обработки. Таким образом, await
немедленно возвращается, делая максимальное время обработки максимальным за все время.
Примечание: есть нюансы: это работает только тогда, когда вы действительно делаете параллелизуемые вещи, такие как asyncio.sleep()
. Если эти задачи являются синхронными (скажем, некоторые вычисления процессора), то оба случая дадут 30 с.
Edit2: Так что ваш main3
имеет немного другой поток. Это позволяет двум задачам работать параллельно. Но не более:
- создать задачу1
- создать задачу2
- await task1
- ожидание задачи2
- создать задачу3
- создать задачу4
- Ожидание задачи3
- Ожидать задание4
Так что на этот раз task1
и task2
происходят параллельно. Но только после того, как они сделаны, task3
и task4
могут работать. В параллели. Таким образом, для каждой группы общее время является максимальным, но вы должны суммировать отдельные группы. То есть общее время выполнения составляет max(task1.time, task2.time)+max(task3.time, task4.time)
, что в вашем случае составляет
max(1,2) + ... + max(1,2) [10 times] = 20