当前位置: 首页 > 后端技术 > Node.js

Node.jsEventLoop判别的三个常见误解和正确概念

时间:2023-04-04 01:03:33 Node.js

Node.jsEventloopmonitor。高频和低持续时间是理想的事件循环状态。上图显示,在3点30分到5点30分之间,事件循环的频率急剧下降,然后持续时间仍然很高。Node.js是一个基于事件的平台。这意味着Node中发生的一切都是对事件的反应。通过Node的事务遍历级联回调。这一切都由一个名为libuv的库处理,它提供了一种称为事件循环的机制。关于Node.js事件循环有很多误解。误解一:事件循环机制运行在与用户逻辑不同的线程中误解:有一个主线程运行用户的JavaScript代码(userland代码),另一个主线程运行事件循环。每次发生异步操作时,主线程将工作交给事件循环线程,一旦完成,事件循环线程通知主线程执行回调。正确理解:只有一个线程在执行JavaScript代码,这就是运行事件循环的线程。回调的执行(运行中的Node.js应用程序中的每个用户空间代码都是回调)由事件循环完成。误解二:异步操作是通过线程池完成的。异步操作,例如使用文件系统、执行出站HTTP请求或与数据库对话,始终加载到libuv提供的线程池中。正确理解:Libuv默认创建一个四线程的线程池来卸载异步工作。今天的操作系统已经为许多I/O任务(例如Linux上的AIO)提供了异步接口。只要有可能,libuv就会使用那些异步接口,避免使用线程池。这同样适用于第三方子系统,例如数据库。该驱动程序的作者宁愿使用异步接口也不愿使用线程池。简而言之:只有在没有其他办法的情况下,才会使用线程池进行异步I/O。误区三:EventLoop使用栈或队列的数据结构,不断遍历异步任务的FIFO,完成后执行Callback。正确理解:虽然涉及到类似队列的结构,但是事件循环并没有遍历和处理栈。作为一个过程的事件循环是一组具有特定任务的阶段,这些阶段以循环方式处理。