Coroutine idea is very old. I am not 100% sure but they were heavily used in Telecom applications.
It's easier in C and old C++ if one can drop down to assembly to switch between different call stacks.
Among modern languages there is Lua. Take a look at Felix too.