node.js事件循环机制探索

每当我们运行一个程序时,都会创建一个实例,并且我们会调用一些内部线程,它们是与该实例相关联的,线程可以看做是CPU必须执行的操作单元,许多不同的线程可以与程序的单个进程相关联。
每当我们能运行node程序时,都会自动创建一个线程,这个线程就是我们整个代码库被执行的唯一地方,其中,还生成了事件循环的东西,这个循环的作用是安排我们唯一的线程在某个给定的时间点应该执行哪些操作。
事件循环实际上就是一个循环,事件循环的每次迭代都成为tick.
事件循环执行tick的条件是什么:
挂起的定时器操作(setTimeout(),setInterval());
挂起的操作系统任务(OS)
挂起的长时间运行操作的执行
只要其中一个操作处于挂起的状态,事件循环就会执行一个新的tick
执行tick
阶段1
node查看挂起的计时器内部集合。并检查传递给setTimeout()和setInterval()
阶段2
node查看挂起的os任务的内部集合,并检查哪些回调函数已经准备好被调用
从计算机检索文件便是一个例子
阶段3
node暂停执行,等待新事件的出现。新事件包括:新的计时器完成、新的 OS 任务完成和新的挂起操作完成。
阶段 4:Node 检查是否准备好调用与挂起定时器(挂起定时器与setImmediate()函数相关)相关的任何函数。
阶段 5:管理关闭事件,用于清理应用程序的状态。
node js完全是单线程吗
错误,node js只是js的运行时单线程的,但是node js标准库中包含的函数并非如此,其异步IO通过线程池的调用是单线程的
例如fs模块函数,是为了保持程序的速度和性能。
这些线程在哪里外包?
使用node js时,使用一个名为libuv的特殊库模块来执行异步操作,此库还与node的后向逻辑一起被用来管理称为libuv的特殊线程池。