原文=>真正理解Node.js事件循环你应该知道的知识Node.js是一个基于事件的平台。这意味着Node中发生的一切都是对事件的反应。Node中的调用是通过一系列的回调来完成的。从开发人员的角度来看,这一切都由一个名为libuv的库处理,它提供了一种称为事件循环的机制。事件循环机制可能是整个环境中最容易被误解的概念常见误区一:时间循环和用户代码运行在不同线程原因:用户代码运行在主线程,事件循环运行在另一个线程,每次callback执行完后,主线程会将工作交给事件循环完成,然后事件循环会ping主线程进行回调。True:只有一个线程在执行JS代码,这个线程就是运行事件循环的线程。执行回调(知道正在运行的node.js应用程序中的每个用户空间代码都是回调)由事件循环完成。稍后我们将对此进行深入讨论。误区2:所有异步事件都由线程池处理原因:执行出站HTTP请求或与数据库对话的异步操作(例如使用文件系统)总是加载到libuv提供的线程池中。正确:默认情况下,libuv创建一个包含四个线程的线程池来卸载异步工作。现在的操作系统已经为很多I/O任务提供了异步接口(比如Linux的aio)。只要有可能,libuv就会使用这些异步接口,避免使用线程池。这同样适用于第三方子系统,例如数据库。在这里,驱动程序作者更愿意使用异步接口而不是线程池。简而言之:线程池仅在没有其他方法时用于异步I/O。误区三:事件循环就像一个栈或者一个队列原因:事件循环不断遍历一系列异步任务,并在任务完成时执行回调正确:虽然涉及到类似队列的结构,但事件循环并不遍历并处理栈。作为流程的事件循环是一组阶段,其中包含以循环方式处理的特定任务。理解事件循环的生命周期要真正理解事件循环,你应该清楚每个作业完成任务的阶段。下图将显示事件循环的工作原理。有关详细信息,请转到=>Node.js事件循环、定时器和process.nextTick()|Node.js计时器通过setTimeout()或setInterval()进行调度。会在这里处理。IOCallbacks处理这里的所有回调。由于node中所有的业务代码都是基于回调的。(例如,对传入http请求的回调会触发级联回调),因此这是处理业务代码的阶段。对下一个处理的新事件集的IO轮询投票立即运行通过setImmediate()注册的所有回调关闭执行所有('关闭')回调工作处理延迟该指标衡量线程池处理异步任务所需的时间。高工作时间处理延迟表示线程池繁忙/耗尽。
