Nodejs中的事件循环、定时器、nextTick()以及与EventEmitter的关系详解

本文详细介绍了Node.js的事件循环机制,包括事件循环模型、各个阶段细节,如timers、pool和check阶段。同时阐述了process.nextTick()的工作原理及其与EventEmitter的关系,展示了它们如何共同确保异步操作的执行。
摘要由CSDN通过智能技术生成

参考资料:The Node.js Event Loop, Timers, and process.nextTick()

什么是事件循环?

事件循环允许nodejs完成非阻塞的IO操作(尽管JavaScript是单线程的)。

简单来说,在nodejs中,遇到IO操作或者网络连接等阻塞性的行为的时候,将这个操作交给nodejs底层的线程池去处理,而不会阻塞主线程。当线程池中的任务完成之后,会将结果和回调函数推入到事件队列中,主线程完成当前正在执行的脚本之后(IO中指定的回调函数),会去检查事件队列并执行其中的回调,直到事件队列为空。

这只是一个大概的概述,接下来解释事件队列的细节

事件循环的模型

当nodejs启动的时候会初始化事件循环,在执行的第一个脚本中可能会执行异步的操作,然后就会处理事件循环。

下面是Node事件循环的模型图,事件循环中的操作按照途中所给的顺序执行。图中的每一个盒子都可以看成事件循环中的一个阶段。

   ┌───────────────────────────┐
┌─>│           timers          │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │     pending callbacks     │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │
│  └─────────────┬─────────────┘      ┌───────────────┐
│  ┌─────────────┴─────────────┐      │   incoming:   │
│  │           poll            │<─────┤  connections, │
│  └─────────────┬─────────────┘      │   data, etc.  │
│  ┌─────────────┴─────────────┐      └───────────────┘
│  │           check           │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
└──┤      close callbacks      │
   └───────────────────────────┘

在事件循环的每一个阶段,都有一个先入先出(FIFO)队列,用来存放要执行的回调函数。当事件循环进入到某一个阶段的时候,按照队列的顺序执行队列中的所有回调函数,直到当前队列中的所有回调函数都被执行或者达到了回调函数的执行限制(如果在poll阶段一直有任务执行,那么timer阶段的任务就可能用于不会执行了,nodejs中为了避免这种其他阶段过于“饥饿”的情况,底层的libev有一个限制,达到限制之后不会向事件循环中添加更多的任务)。

之后会切换到下一个阶段,执行该阶段的任务队列。

实例:

const fs = require('fs');

function someAsyncOperation(callback) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值