You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constfs=require('fs');constsetTimeOutlogger=()=>{console.log('setTimeout logger');}constsetImmediateLogger=()=>{console.log('setImmediate logger');}//For timeout setTimeout(setTimeOutlogger,1000);//File I/O operationfs.readFile(__filename,'utf-8',(data)=>{console.log('Reading data 1');});fs.readFile(__filename,'utf-8',(data)=>{console.log('Reading data 2');});fs.readFile(__filename,'utf-8',(data)=>{console.log('Reading data 3');});fs.readFile(__filename,'utf-8',(data)=>{console.log('Reading data 4');});fs.readFile(__filename,'utf-8',(data)=>{console.log('Reading data 5');});//For setImmediatesetImmediate(setImmediateLogger);setImmediate(setImmediateLogger);setImmediate(setImmediateLogger);
Event Loop
很多人看到Event Loop时表现如下:
其实你只要搞懂下面这个图,他就狠简单明了:
NodeJS事件循环可能是Node中最容易被误解的概念之一,不服来看一个🌰
输出结果是什么呢?根据文件的大小以及文件中的内容,结果可能会有所不同
当Node.js启动时,它会初始化Event Loop,处理输入的Script(可能会发出异步API调用),然后开始处理Event Loop
注意,只有一个线程,那就是Event Loop运行的线程。事件循环以周期顺序工作,具有不同的阶段。Event循环的操作顺序如下所示:
Event循环中有六个阶段,但有一个阶段只在内部工作。以下是Node.js文档中每个阶段的概述
setTimeout vs setImmediate
if you schedule the two calls within an I/O cycle, the immediate callback is always executed first:
setTimeout(fn,0)
回调函数调用直到事件循环进入timer阶段才会执行。因此,当你在close callbacks阶段中同时调度setTimeout(fn,0)和setImmediate(),将保证在setImmediate()之前执行setTimeout(fn,0)
setImmediate()
首先,通过事件循环的工作流程,现在我们可以说setImmediate()并不是立即执行的,但包含此setImmediate回调的队列将在每次迭代中执行一次(当事件循环处于check阶段时)。所以这是非确定性的,因为它取决于process性能。但是,如果我们在I/O回调阶段中执行这段代码,我们可以保证在setTimeout之前调用setImmediate的回调
process.nextTick
process.nextTick()狠有趣,它与事件循环的当前阶段无关,将在当前操作完成后立即开始执行。因此,如果事件循环处于timers中,并且timer队列中有5个回调,事件循环正忙于执行第三个。那时,如果有一些process.nextTick()回调被推送到nextTickQueue,则事件循环将在完成当前回调执行(即第三个回调)之后同步执行所有这些回调,并且将从第4个回调再次恢复执行timer回调
为什么process.nextTick被包含在Node.js中? 其实是一种设计理念,即即使不需要,API也应该始终是异步的
Quiz
Tips
I/O用于标示CPU中的进程与CPU外部(包括内存/磁盘网络,甚至是另一个进程)之间的通信,在Node中这通常用于指磁盘和网络资源
事件循环是处理外部事件并将其转换为回调函数调用的实体
当没有更多事件要执行时,Node将退出事件循环
V8调用堆栈可以看作是函数的列表,堆栈是FILO(First In Last Out)数据结构,当调用堆栈变空时,event队列不为空,如果有回调函数则将队列出队,然后调用事件的回调
一个函数应该始终是同步或异步
Reference
Event Loop Bible
The text was updated successfully, but these errors were encountered: