Stackful и Stackless coroutines
В чём различия двух типов корутин? И какой подход реализуется в Go? (каким типом являются горутины)
Ответы (1 шт):
Сравнивать горутины и корутины - это как сравнивать горячее с высоким. Они предназначены для разных задач и спроектированы по-разному.
Корутины в С++ задуманы для написания асинхронных алгоритмов и генераторов в виде функций. Корутины в С++ возвращают значения. Это принципиальное отличие от горутин. Всё в корутинах заточено на возвращение значений. co_yield и co_return создают значения, co_await получает значение. В каком-то смысле это старый недобрый setjmp/longjmp с поддержкой хранилища локальных переменных от компилятора.
Горутины предназначены для реализации легковесных потоков, для которых переключение не требует обращения к ядру. Горутины не возвращают значения. Соответственно, в го нет ни yield, ни await. Нужно явным образом организовывать передачу данных из горутины через каналы.
Я не буду разводить флейм на тему, что лучше - асинхронные алгоритмы с yield/wait или легковесные потоки с каналами. Лично я препочитаю потоки/горутины, потому что мне проще думать в стиле обмена данными между акторами, а не нарезки функциональности на асинхронную лапшу.
Возвращаясь к вашему вопросу - считайте горутины stackfull.