Я не уверен на 100%, понимаю ли я ваш вопрос, но, возможно, это поможет:
Сопрограммы обычно выполняются в том же потоке, с которого вы их начинаете.Вы можете использовать разные диспетчеры, но они предназначены для работы при запуске из одного потока.Никакого дополнительного планирования не происходит.Вы можете сравнить это с механизмами планирования в ОС.Сопрограммы ведут себя подобно кооперативному планированию.Вы найдете похожие концепции во многих средах и языках для работы с асинхронными операциями.Например, в Ruby есть волокна, которые ведут себя одинаково.
По сути, это означает, что если сопрограмма загружает ваш процессор в занятом цикле, вы не можете отменить его (если не уничтожите весь процесс).Вместо этого ваши сопрограммы должны регулярно проверять отмену, а также добавлять ожидания / задержки / выходы, чтобы другие сопрограммы могли работать.
Это также определяет, когда сопрограммы наиболее полезны: при работе в однопоточномконтекст, это не помогает использовать сопрограммы для локальных расчетов.Я использовал их в основном для обработки асинхронных вызовов, таких как взаимодействие с базами данных или веб-серверами.
В этой статье также есть некоторые пояснения о том, как работают сопрограммы - возможно, это поможет вам с любыми дополнительными вопросами: https://antonioleiva.com/coroutines/