У вас есть пара проблем. Когда вы набираете run_until_complete
, он ждет завершения coro
, прежде чем перейти к вашему run_forever
вызову. Как вы определили, coro
никогда не заканчивается. Он содержит бесконечный цикл, который ничего не делает, чтобы вырваться из цикла. Вам нужно break
или return
где-то внутри цикла, если вы хотите перейти к следующему шагу в вашем приложении.
Однако, как только вы это сделаете, ваш следующий вызов будет run_forever
, который, как следует из его названия, будет работать вечно. И в этом случае ему нечего делать, потому что вы ничего не запланировали с помощью цикла событий.
Я ожидал, что сопрограмма будет выполнена только один раз, потому что она содержит выход и должна была вернуть управление вызывающей стороне.
Если посмотреть на тот факт, что ваша сопрограмма не имеет выхода, ожидание (или уступка в зависимости от того, какой синтаксис вы решите использовать) не возвращает управление вызывающей стороне run_until_complete
или run_forever
. Он возвращает управление в цикл обработки событий, так что он может проверять все, что ожидалось и готово возобновить.