Node 事件循环究竟是如何工作的/ 为何大部分的事件循环图都是错的

170 阅读2分钟

译者:萧暮

原文链接

当 Bert 在 2016 年欧洲 Node 交流大会上提出关于事件循环的主题时,他以一句“大部分的事件循环图都是错的”开场。我很愧疚,我演讲中也用过一些错误的图。:)

就是如此。事件循环像做热蛋糕一样在客户端循环处理数据。

他给的图非常接近真实情况。在此,事件循环开始,工作,最后退出(双关语)。

下面是图中的一些重要步骤:

  1. 运行一个脚本: node index.js

  2. 脚本中包含 setTimeout()setInterval()

  3. 一些代码在运行

  4. Unicorn 函数(稍后详细介绍)

  5. 更多代码

  6. setImmediate() 其实没有立即运行

  7. 代码

  8. 清理结束的事件

  9. 最后的代码

  10. 如果有 refs 回到第 2 步,没有则进程退出

Refs 是一个简单的计数器,当有一个异步回调将要执行时增加,当它最后执行结束时减少。如果是流式回调(比如监听 data),那么只会有一个引用增加。

title

每段 JS 代码块都有它自己的 process.nextTick()

title

是的。nextTick() 事实上是立即执行,而 setImmediate() 则是在下一个时钟(tick)运行。啊。把它们记成跟方法名相反的吧。换句话说,如果你有一堆嵌套的 nextTick() 回调,你的代码会直接在 JS 块中运行,永远不会到下一个事件循环(步骤 2-9).

最后来说说 unicorn 函数。它像一个 Node 和操作系统的通信器。如你所知,操作系统及其进程都是异步的,但他们看起来却是同步的。unicorn 利用异步性质并为 Node 的事件循环所用。加一句,unicorns 很酷:

title

顺便说一句,尽管如图所述,线程池不能处理网络请求或 TCP 套接字。后者发生在内核中。

title

要掀桌子了(Table flip)?确实。但好消息是 Node 主要用来进行构建一个 Express 服务器或者运行一个 Gulp 任务之类的工作,而不必了解事件循环究竟是怎么工作的!

非常感谢 Bert。这是我在 2016 年欧洲 Node 交流大会上最喜爱的演讲之一。现在我要去重画我的图表,更准确地描述事件循环在 Node 中实际是如何工作的。:) 这个怎么样?

旁注:如果你喜欢这篇文章,并且对企业现场培训 JavaScript,Node.js 和 React.js 以提高团队生产力感兴趣,请联系 NodeProgram.com

title