ref: https://jiajunhuang.com/articles/2018_04_03-coroutine.md.html
协程是用户空间的“线程”,由程序员自己控制代码跳转。
协程分为有栈(stackful)协程和无栈(stackless)协程:
-
有栈协程:
- 如goroutine和greenlet。每个G都有自己的栈指针SB,SP等。切换到某个G执行时,将SP和SB刷到寄存器, 使用G自带的栈。
- 优点是更加灵活,可以整栈切换。
-
无栈协程:
- 如Python中的generator(带yield的函数就是generator),只把该函数执行时的帧带上, 执行时,使用调用者的栈。
- 无栈协程职能拿最上面的帧。因此优点是要保存的数据较少。缺点是没有有栈协程灵活, 可以一锅端。通常性能也比有栈协程差一点。