When a program becomes very long and
complex, it is convenient to divide it into subroutines, each of which
implements a specific task. However, subroutines cannot be executed
independently, but only at the request of the main program, which is
responsible for coordinating the use of subroutines.
In this post, we introduce a
generalization of the concept of subroutines, known as coroutines: just like
subroutines, coroutines compute a single computational step, but unlike
subroutines, there is no main program to coordinate the results. The
coroutines link themselves together to form a pipeline without any supervising
function responsible for calling them in a particular order.