Open 981377660LMT opened 1 year ago
https://www.bilibili.com/video/BV1VM411C73z
go程可以利用多核,加速 CPU Bound的任务
抢占是一个很低效的操作
协程有两代:
第一代是操作系统那帮人搞的,这代协程的本质是用户态线程切换, 在用户态实现了线程调度。 这代协程最终成熟形态是线程池对大量任务的执行。 开源的实现就是 golang (但是丢弃了一些协程的优势,带来的复杂度使得使用协程跟使用线程具有相同的心智负担,有抢占就和线程没区别了:同步和竞争条件)
第二代协程是 async/await,来自于做并行计算那帮人。正式名称叫 Join calculus,概念本身来自于 caml 社区。 这代协程本质上解决的问题是同步操作时,CPU 或线程浪费的问题。 二代协程和一代的区别在于编程时候是否以类似同步方式开发的,能否降低开发人员心智负担。
不管是一代协程还是二代协程,性能都没有线程+callback 高
如何评价 stackless 和 stackful? 一般不建议讨论协程的时候提起 stack,显得基础不够扎实: stack 并不是 coroutine 独有的实现问题,它实际上是 routine/subroutine 的实现问题。只要是函数调用,实现上就有需要 stack 问题
golang: 有栈协程 js/python: 无栈协程
至于说协程减少上下文切换,这是当然的,因为都是同一个线程,同一个线程内当然减少了上下文切换。
Golang、Kotlin、C#、JS、Python 等都有协程,市面上的协程有什么本质上的区别? - readcopy 的回答 - 知乎 https://www.zhihu.com/question/502314022/answer/2343470555