理解coroutine

什么是coroutine?

协程是自己程序调度的,逻辑上并行执行,底层上非并行执行
线程是操作系统调度的,逻辑和底层上都是并行执行

用户控制切换,自动保存上下文状态,切换之间可以通过参数通信,可用同步的方式实现异步。这是我理解中的协程最重要的几个特征。

协程的切换开销远远小于内核对于线程的切换开销,因此对于IO密集型的程序,使用协程的优势在于用户可以像写同步IO一样,无需关心IO异步接口的细节。封装等待IO返回的逻辑,跳转到coroutine库进行调度。减小使用多个线程做同步IO带来的内核大量线程切换的开销。

coroutine和goroutine对比

协程在各语言中的实现应用

php

lua

python

node.js

首先coroutine是个很宽泛的概念,async/await也属于coroutine的一种。但是问题是拿async/await和stackful coroutine比较。所谓stackful是指每个coroutine有独立的运行栈,比如每个goroutine会分配一个4k的内存来做为运行栈,切换goroutine的时候运行栈也会切换。stackful的好处在于这种coroutine是完整的,coroutine可以嵌套、循环。与stackful对应的是stackless coroutine,比如generator,continuation,这类coroutine不需要分配单独的栈空间,coroutine状态保存在闭包里,但缺点是功能比较弱,不能被嵌套调用,也没办法和异步函数配合使用进行控制流的调度,所以基本上没办法跟stackful coroutine做比较。但是async/await的出现,实现了基于stackless coroutine的完整coroutine。在特性上已经非常接近stackful coroutine了,不但可以嵌套使用也可以支持try catch。所以是不是可以认为async/await是一个更好的方案?

扩展-并发

您的支持将鼓励我继续创作 笔芯