前端面试题 - 52. generator 是如何做到中断和恢复的

453 阅读1分钟

问这个问题是否有点超纲。或者说有什么意义呢?

参考v8源码分析:zhuanlan.zhihu.com/p/150984402

应该是:

  • 开始:创建生成器对象。
  • 暂停:SuspendGenerator 的功能是暂停当前函数的执行,其字节码处理函数里面多次调用 StoreObjectField 来保存生成器函数当前运行的状态,最后返回累加器中的值,之前提到过,此时累加器存的是生成器对象 generator。所以 V8 代码中的生成器对象 generator 返回给了 JavaScript 代码中的 iterator。
  • 恢复:ResumeGenerator 恢复之前保存的状态,最后调用 Dispatch 函数,取出下一条字节码。

参考协程角度的解释:blog.csdn.net/qq_42698576…

一个线程(或函数)执行到一半,可以暂停执行,将执行权交给另一个线程(或函数),等到稍后收回执行权的时候,再恢复执行。这种可以并行执行、交换执行权的线程(或函数),就称为协程。

协程是一种比线程更加轻量级的存在。普通线程是抢先式的,会争夺cpu资源,而协程是合作的,可以把协程看成是跑在线程上的任务,一个线程上可以存在多个协程,但是在线程上同时只能执行一个协程。它的运行流程大致如下:

协程A开始执行 协程A执行到某个阶段,进入暂停,执行权转移到协程B 协程B执行完成或暂停,将执行权交还A 协程A恢复执行 协程遇到yield命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。