Я уже углубился в детали реализации с аргументом продолжения и конечным автоматом и следил за пояснениями Романа Елизарова о том, как они разрабатывали сопрограммы. Я прочитал большинство упомянутых вами ресурсов перед написанием статьи (хотя, конечно, не весь Google о сопрограммах). И все же «suspend function = coroutine» - это то, чего я не читал, у вас есть ссылка на что-то, говорящее об этом? Или вы сами это сделали?
Я понимаю, что суть сопрограмм основана на реализации функций приостановки с продолжениями и конечными автоматами за кулисами, но это не имеет отношения к тому, являются ли функции приостановки сопрограммами или нет. В руководстве пользователя, на которое вы ссылаетесь, термины сопрограммы и приостановка функций не используются как взаимозаменяемые. Нам нужно выровнять словарь, который мы используем, если мы хотим передать сообщение читателю, и они решили называть сопрограммы «легкими потоками» выполнения, а не каждой «подзадачей», которая ставится в очередь механизмом продолжения (или , если хотите, конечные автоматы, стоящие за функциями приостановки).
Важно различать детали реализации и API. В этой статье я использовал подход руководства пользователя: новая сопрограмма запускается с помощью построителя сопрограмм. Приостановочные функции - это обычные синхронные по умолчанию функции с точки зрения пользователя, что бы ни происходило за кулисами.
Действительно, приостанавливающие функции - это способ заменить обратные вызовы, точно так же, как механизм async / await в JS (и я провел параллель между ними в другой статье, если вам интересно). Но передача аргумента функции не делает вызов функции асинхронным. Если функция вызывается на месте синхронно, тогда ничего не происходит асинхронно. Вот почему здесь он скорее называется блокировкой, чем обратным вызовом.
Разница между синхронным и асинхронным заключается в том, будет ли переданная вами функция гарантированно вызываться до того, как выполнение вернется к вызывающему, и это решается не в самом объявлении функции приостановки, а через построитель сопрограмм, который вы используете.
Все инструкции в одной сопрограмме (запущенной одним построителем сопрограмм) будут выполняться по порядку, даже при вызове нескольких функций приостановки, если другая сопрограмма не запущена через другой построитель сопрограмм. Таким образом, функции приостановки не несут асинхронность с точки зрения программиста, в отличие от создателей сопрограмм.