Stackful и Stackless coroutines

В чём различия двух типов корутин? И какой подход реализуется в Go? (каким типом являются горутины)


Ответы (1 шт):

Автор решения: Pak Uula

Сравнивать горутины и корутины - это как сравнивать горячее с высоким. Они предназначены для разных задач и спроектированы по-разному.

Корутины в С++ задуманы для написания асинхронных алгоритмов и генераторов в виде функций. Корутины в С++ возвращают значения. Это принципиальное отличие от горутин. Всё в корутинах заточено на возвращение значений. co_yield и co_return создают значения, co_await получает значение. В каком-то смысле это старый недобрый setjmp/longjmp с поддержкой хранилища локальных переменных от компилятора.

Горутины предназначены для реализации легковесных потоков, для которых переключение не требует обращения к ядру. Горутины не возвращают значения. Соответственно, в го нет ни yield, ни await. Нужно явным образом организовывать передачу данных из горутины через каналы.

Я не буду разводить флейм на тему, что лучше - асинхронные алгоритмы с yield/wait или легковесные потоки с каналами. Лично я препочитаю потоки/горутины, потому что мне проще думать в стиле обмена данными между акторами, а не нарезки функциональности на асинхронную лапшу.

Возвращаясь к вашему вопросу - считайте горутины stackfull.

→ Ссылка