How event loop works in Node.js?
发布于 2 天前 作者 wxlfight 207 次浏览 来自 分享

程序员对于同步执行的代码会比较容易理解,因为这符合人的思维习惯,可是像nodejs这种异步的代码,就有点看不懂它具体是怎么执行的了。但咱们会遇到这样的问题,别人也会遇到,其中一个人就做了一个“模拟器”,很直观的展示nodejs异步代码执行的整个过程。这里有一小段异步代码:

function httpRequest(){ console.log(‘start to process request.’); //some slow async job setTimeout(function(){ console.log(‘finish callback’); }, 7000); console.log(‘ready to accept another request.’); } //模拟并发请求(其实不是并发,但是不影响理解,真正的并发也是同样的道理) httpRequest(); httpRequest(); httpRequest();

来,我们先感性的看下这段代码的执行过程 因为压缩的比较严重,如果看不清,可以访问最后参考资料中的模拟工具链接,自行运行。如果觉得程序运行过快,可以点击左上角的图标,然后调整’Detlay time’来控制程序执行的速度。 nodejs_event_loop (1).gif

介绍一下该工具 Screen Shot 2019-08-26 at 3.11.57 PM.png

  • 左上角点击图标显示额外的设置界面。'delay time’用来调整代码执行的速度,'Simulate renders’用来模拟浏览器中的event loop和页面render的关系(nodejs的event loop和浏览器中的会有一些差异)
  • 中间是代码部分。
  • 右边’Call Stack’是栈,也就是楼主理解的运行同步代码的地方。 'Web Apis’表示所有异步的请求,比如http请求,IO等等,它们完成需要一些时间。 'Callback Queue’是一个存放各种callback的队列,比如web api中的某一个http请求完成了,那么对应的callback方法就会进到该队列。

相信到现在为止,大家应该对该代码的执行过程有所了解,其中有几个需要注意的点: 1.stack中的代码没执行完,Callback queue是不会出栈的。 2.截图中的’Callback queue’看起来就一个队列,其实真正的实现是多个队列,每个队列存放不同类型的callback,event loop基于某种顺序以及规则轮询这些队列,如果了解清楚这个,那么对于某些程序执行的结果就不会感到吃惊。

扩展思考 1.如果代码中出现CPU密集的任务,比如编码解码或者大循环,对程序会有什么影响?Nodejs如何处理CPU密集型的计算(提示:分片或partition,C++ adon,child process,cluster)? 2.如果一段代码中同时包含setTimeout,setInternal,Setimmediat,Process.nextTick,那么他们对应的Callback执行顺序是怎样的?其中Process.nextTick的使用需要注意什么?

参考资料 菲利普·罗伯茨:到底什么是Event Loop呢? nodejs event loop运行模拟工具 nodejs event loop 文档

回到顶部