Вывод:

Вывод:

@python_quiz

Разберем этот квиз

Заголовок: Порядок вывода при использовании asyncio.call_soon и await asyncio.sleep(0)

Код задачи

python

Краткое объяснение результата

  • asyncio.get_running_loop().call_soon ставит колбэк в очередь "ready" — он будет выполнен при следующей возможности цикла событий, как только управление вернётся к циклу.
  • await asyncio.sleep(0) приостанавливает текущую сопрограмму и отдаёт управление циклу событий, позволяя выполнить готовые колбэки.
  • Следовательно, сначала выполняется колбэк, который печатает "A", а затем возобновляется сопрограмма и печатает "B".

Подробный разбор вариантов (почему что происходит)

  • "Сначала выведется только 'A'": неверно — после вывода 'A' сопрограмма продолжит выполнение и печатает 'B'.
  • "Сначала выведется только 'B'": неверно — перед возобновлением сопрограммы цикл выполнит готовые колбэки, поэтому 'A' успеет напечататься до 'B'.
  • "Сначала 'A', затем 'B'": соответствует поведению кода — call_soon ставит колбэк в очередь, await asyncio.sleep(0) отдаёт контроль циклу, колбэк выполняется (печать 'A'), затем сопрограмма возобновляется и печатает 'B'.
  • "Сначала 'B', затем 'A'": возможно в другой версии кода (см. ниже), но не для данного примера с await asyncio.sleep(0).

Демонстрации и вариации
1) Оригинальное поведение (A, затем B)

python

2) Если убрать await и сразу напечатать 'B', поведение поменяется: сопрограмма не отдаёт управления циклу до выполнения print('B'), поэтому сначала увидим 'B', затем 'A'.

python

3) Аналогично, если вы используете await asyncio.sleep(0) в другом месте или ставите задачу через create_task, порядок зависит от того, когда именно текущая сопрограмма уступит управление циклу и какие колбэки/задачи готовы к выполнению.

Короткие выводы и рекомендации

  • call_soon ставит колбэк в очередь ready — он выполнится, когда цикл снова получит управление.
  • await asyncio.sleep(0) — удобный приём, чтобы "уступить" управление и дать циклу выполнить готовые колбэки/задачи.
  • Понимание, когда код отдаёт управление циклу (через await), критично для прогнозирования порядка вывода в asyncio-программах.

Report Page