看了一些语言的coroutine的使用方式后,不免有些疑问,为什么区别这么大
这就涉及到stackless/stackfull实现方式的影响了
stackless coroutine的 栈 的调用栈复用,栈内信息保存在堆上(用于恢复)
stackfull coroutine的有独立私有的栈
stackless coroutine 最大的优势就是性能好,缺点就是易用性
stackfull coroutine的最大优势就是易用性,缺点就是空间浪费,性能差
stackless coroutine 增加语义化支持(通过强大的编译器做了很多事), 在易用性方面已经不弱于stackfull coroutine了
而stackfull coroutine 增通过预分配一定大小的栈,检查是否超出(go似乎是通过编译器在函数调用前插入检查代码)来扩容,采取一定的收缩策略(go似乎是垃圾回收时候进行收缩的)
参考:
https://stackoverflow.com/questions/28977302/how-do-stackless-coroutines-differ-from-stackful-coroutines
https://blog.varunramesh.net/posts/stackless-vs-stackful-coroutines/