Most sources will give cooperative as the origin. A coroutine wasn't originally a unit of concurrency or multitasking. Instead it's a variation on the concept of a subroutine. Subroutines (i.e. functions) return to their caller; coroutines can transfer control to another arbitrary routine instead. A program using that original form of coroutines would still be a single sequential control flow, and wouldn't execute concurrently. The modern use of coroutine, to refer to concurrent virtual threads, came later, influenced by things like goroutines.