Life of a coroutines has little to do with kernel blocking calls. Coroutines are just convenient way to write async code — without callbacks and futures. How and where it exactly blocks (if it even block) depends on the async library you are using, and has no direct relations to the coroutines themselves.