Описание тега coroutine
Сопрограммы - это общая структура управления, посредством которой управление потоком совместно передается между двумя разными подпрограммами без возврата.
Сопрограмма - это пара кодовых последовательностей, которые могут обмениваться управлением.
Аппаратно это достигается путем перестановки вершины стека и счетчика программ. Совместные подпрограммы широко использовались внутри операционных систем.
Сопрограммы хорошо подходят для создания итераторов и конвейеров. Подпрограммы могут возвращаться только один раз; напротив, сопрограммы могут возвращать (давать) несколько раз. Yielding возвращает результат вызывающей сопрограмме и возвращает ей управление, как и в обычной подпрограмме. Однако при следующем вызове сопрограммы выполнение начнется сразу после вызова yield.