一、进程、线程、协程的区别
- 进程:操作系统中分配资源的基本单位
- 线程:操作系统中调度资源的基本单位
- 协程:比线程更小的的执行单元,自带cpu上下文,一个协程一个栈
- 一个进程中可能存在多个线程,一个线程中可能存在多个协程。
- 进程、线程的切换由操作系统控制,而协程的切换由程序员自身控制。
- 异步i/o利用回调的方式来应对i/o密集,同样的使用协程也可以来应对,协程的切换并没有很大的资源浪费,将
- 一个i/o操作写成一个协程,这样进行i/o时可以把cpu让给其他协程。
- js同样支持协程,那就是yield。使用yield给我们直观的感受就是,执行到了这个地方停了下来,其他的代码继续跑,到你想让他继续执行了,他就是会继续执行。
二、协程的运行流程
第一步,协程A开始执行。
第二步,协程A执行到一半,进入暂停,执行权转移到协程B。
第三步,(一段时间后)协程B交还执行权。
第四步,协程A恢复执行。
function asnycJob() {
// ...其他代码
var f = yield readFile(fileA);
// ...其他代码
}
上面代码的函数 asyncJob 是一个协程,它的奥妙就在其中的 yield 命令。它表示执行到此处,执行权将交给其他协程。也就是说,yield命令是异步两个阶段的分界线。
协程遇到 yield 命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。它的最大优点,就是代码的写法非常像同步操作,如果去除yield命令,简直一模一样。