• Node.js Video Tutorials

Node.js - 事件循环



尽管JavaScript是单线程的,但Node.js通过尽可能将操作委托给系统内核来执行异步非阻塞I/O操作,从而使用事件循环。大多数现代操作系统内核是多线程的,能够通过在后台执行来处理多个操作。当当前操作完成后,内核会通知Node.js,以便可以将相应的回调添加到轮询队列中,最终执行。

Node.js启动后(通过提供.js脚本或在REPL模式下),事件循环就会初始化。下图显示了事件循环的操作顺序:

Event Loop
  • Timers阶段执行由setTimeout()和setInterval()调度的回调函数。

  • Pending callbacks阶段执行推迟到下一个循环迭代的I/O回调函数。

  • Poll阶段有两个主要功能:(a) 计算应阻塞和轮询I/O的时间长度;(b) 处理轮询队列中的事件。Node.js在此阶段检索新的I/O事件并执行与I/O相关的回调函数。

  • Check阶段在Poll阶段完成后立即执行回调函数。如果Poll阶段变为空闲并且脚本已使用setImmediate()计时器排队,则事件循环继续进入Check阶段,而不是等待。libuv库是Node.js运行时的一部分,负责提供处理异步操作的支持。

JS Code
  • V8引擎处理JavaScript代码的执行,而Libuv库利用相应操作系统的原生机制来处理异步操作。

  • 最后,Close callbacks阶段处理使用close事件注册的回调函数,例如socket.on(‘close’, function)。如果套接字突然关闭,则会发出close事件,否则将由process.nextTick()方法发出,以将函数的执行推迟到事件循环的下一个迭代。

在开始事件循环的下一个运行之前,Node.js会检查它是否正在等待任何异步I/O或计时器。如果没有,则运行时会干净地关闭。

了解事件循环的工作原理对于构建可扩展的Node.js应用程序至关重要。事件循环是Node.js的一个基本部分,它通过确保主线程不被阻塞来实现异步编程。

广告