Существует три различных сценария, которые вы излагали:
- Нет
await
утверждений (оба комментария закомментированы) - Используйте только
await task1
(закомментируйте второй) - Используйте только
await task2
(закомментируйте первый)
Вот ваш сценарий;немного увеличьте время ожидания на task2
только для иллюстрации.
# tasktest.py
import time
import asyncio
async def say_after(delay, what):
await asyncio.sleep(delay)
print(what)
async def main():
task1 = asyncio.create_task(
say_after(1, 'hello'))
task2 = asyncio.create_task(
say_after(3, 'world'))
print('started at', time.strftime('%X'))
await task1
# await task2
print('finished at', time.strftime('%X'))
asyncio.run(main())
1.Нет await
операторов
Вот мясо asyncio.run()
:
loop = events.new_event_loop()
try:
events.set_event_loop(loop)
loop.set_debug(debug)
return loop.run_until_complete(main) # < -----
finally:
try:
_cancel_all_tasks(loop) # < -----
loop.run_until_complete(loop.shutdown_asyncgens())
finally:
events.set_event_loop(None)
loop.close()
Важно, что цикл только заботится о том, чтобы main()
завершено, а затем отменяет все другие задачи, связанные с запущенным циклом событий.(Каждая задача связана с циклом событий, когда она указана.)
Если вы определяете main()
без каких-либо операторов await
, create_task()
планирует выполнение задач,но main()
не ждет завершения одного из них.
2.await task1
Настройка:
await task1
# await task2
Вывод:
(base_py37) $ python3 tasktest.py
started at 11:06:46
hello
finished at 11:06:47
Обе задачи переходят из режима ожидания в режим ожидания, но только task1
завершается, поскольку main()
ожидается только для задачи, которая занимает ~ 1 секунду, что недостаточно для запуска task2
. * (обратите внимание, что main()
занимает всего 1 секунду.)
3.await task2
Настройка:
# await task1
await task2
Вывод:
(base_py37) $ python3 tasktest.py
started at 11:08:37
hello
world
finished at 11:08:40
Обе задачи переходят из режима ожидания в режим ожидания, и теперь оба task1
и task2
завершены, потому что main()
ожидается для задачи, которая занимает ~ 3 секунды, достаточно долго для выполнения обеих задач до завершения.
* Это относится, по крайней мере, к моей настройке (Mac OSX,....) но, как уже упоминалось в другом ответе, время может отличаться по времени при другой настройке, и, если время выполнения задачи схоже, оба могут запускаться в таких местах, как случай № 2.