Event_looop-事件循环机制

一,什么是Event_loop

Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。

二,事件循环的进程模型

1,选择当前要执行的任务队列,选择任务队列中最先进入的任务,如果任务队列为空,即null,则执行跳转到微任务(MicroTaks)的执行步骤

2,将事件循环中的任务设置为已选择任务

3,执行任务

4,将事件循环中当前运行任务设置为null

5,将已经运行完成的任务从任务队列中删除

6,microtasks步骤,进入microtask检查点

7,更新界面渲染

8,返回第一步

执行进入microtask检查点时,用户代理会执行以下步骤:

设置microtask检查点标志为true。
当事件循环microtask执行不为空时:选择一个最先进入的microtask队列的microtask,将事件循环的microtask设置为已选择的microtask,运行microtask,将已经执行完成的microtask为null,移出microtask中的microtask。
清理IndexDB事务
设置进入microtask检查点的标志为false。
原文链接:https://blog.csdn.net/weixin_53504991/article/details/115455041

 

 三,NodeJS的Event Loop

Node中的Event Loop是基于libuv实现的,而libuv是 Node 的新跨平台抽象层,libuv使用异步,事件驱动的编程方式,核心是提供i/o的事件循环和异步回调。libuv的API包含有时间,非阻塞的网络,异步文件操作,子进程等等。 Event Loop就是在libuv中实现的。

什么是libuv?

Libuv是Node.js的多平台支持库,主要用于异步I/O。它主要是为Node.js开发的,随着时间的推移,它被广泛用于其他系统,如Luvit、pyuv、Julia等。Libuv基本上是对依赖于平台的libev/IOCP的抽象,为用户提供基于libev的API。

libuv的一些重要特性是:

  1. 支持全功能事件循环
  2. 文件系统事件
  3. 异步文件和文件系统操作
  4. 异步TCP和UDP套接字
  5. 子进程

理解libuv的基本原理

 NodeEvent loop一共分为6个阶段,每个细节具体如下:

  1. timers: 执行setTimeout和setInterval中到期的callback。
  2. pending callback: 上一轮循环中少数的callback会放在这一阶段执行。
  3. idle, prepare: 仅在内部使用。
  4. poll: 最重要的阶段,执行pending callback,在适当的情况下回阻塞在这个阶段。
  5. check: 执行setImmediate(setImmediate()是将事件插入到事件队列尾部,主线程和事件队列的函数执行完成之后立即执行setImmediate指定的回调函数)的callback。
  6. close callbacks: 执行close事件的callback,例如socket.on('close'[,fn])或者http.server.on('close, fn)。
  7. Node 与浏览器的 Event Loop 差异
  8. 浏览器环境下,microtask 的任务队列是每个 macrotask 执行完之后执行。而在 Node.js 中,microtask 会在事件循环的各个阶段之间执行,也就是一个阶段执行完毕,就会去执行 microtask 队列的任务。

 总结


浏览器和 Node 环境下,microtask 任务队列的执行时机不同

Node 端,microtask 在事件循环的各个阶段之间执行
浏览器端,microtask 在事件循环的 macrotask 执行完之后执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值