Когда я запускаю его на cpython 3.6, следующая программа печатает hello world
один раз, а затем вращается вечно.
В качестве примечания, если раскомментировать строку await asyncio.sleep(0)
, она напечатает hello world
каждую секунду, что понятно.
import asyncio
async def do_nothing():
# await asyncio.sleep(0)
pass
async def hog_the_event_loop():
while True:
await do_nothing()
async def timer_print():
while True:
print("hello world")
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
loop.create_task(timer_print())
loop.create_task(hog_the_event_loop())
loop.run_forever()
Такое поведение (печать hello world
один раз) имеет смысл для меня, потому что hog_the_event_loop
никогда не блокирует и, следовательно, не нуждается в приостановке выполнения. Могу ли я рассчитывать на это поведение? Когда работает строка await do_nothing()
, возможно ли, что вместо ввода сопрограммы do_nothing()
выполнение будет фактически приостановлено и возобновится timer_print()
, что приведет к печати программы hello world
во второй раз?
В целом: когда python приостановит выполнение сопрограммы и переключится на другую?Возможно ли любое использование ключевого слова await
?или это только в тех случаях, когда это приводит к базовому select
вызову (например, ввод-вывод, таймеры отключения и т. д.)?
Дополнительное уточнение
Я понимаю, что если hog_the_event_loop
Выглядело это так, что, безусловно, никогда не приведет к выполнению другой сопрограммы:
async def hog_the_event_loop():
while True:
pass
Я пытаюсь конкретно задать вопрос о том, отличается ли await do_nothing()
от вышеуказанного.