众所周知 ,多线程除了会给cpu带来切换上下文的开销,还会产生资源竞争,想要用多线程,免不了这里那里加个锁。
所以多线程在有些时候并不讨巧。
所以,协程出现了,他也可以并发的执行多线逻辑,但完全不会给cpu带来额外负担,且不存在任何资源竞争。
看起来,协程可以完美替代多线程了。
但其实,协程也只是在特定应用情境下才适用。
使用多线程的目的之一是为了不阻塞主线程的迭代循环,让主线程可以顺畅运行,而协程的使用目的就只限于此。
那些需要计算,可能在同一帧内做大量运算的事情,就无法靠协程去并发。因为他们也会加大主线程在一帧内的计算量,一样会造成卡帧。
所以协程做的基本上是一些检查工作
检查一个计时器是否到了指定的时间
检查一个下载是否已经完成
检查另一个协程是否结束
甚至什么不做
更进一步归纳
协程的yield 就相当于 异步函数的await
区别是 yield背后执行的每帧检查工作在主线程 且每次检查几乎不费事
而await 后面跟的是一个Task 一个可能需要花上很久才能结束的多线程任务
(其实,理论上感觉,只要这个task的逻辑可以分成多帧去执行 且可以控制好每帧的计算量
就可以用协程代替他。
当然多核处理的优势是无论如何都没法替代的,特别是在将来很有可能普及32线程甚至64线程的产品,
一个协程就想以一敌百吗,纵使你有百般能耐,也不可能以一敌百....)