event loop async await 事件循环机制

简介: event loop async await 事件循环机制

首先由一个小题目导入

console.log(1) // 同步任务进入主线程
setTimeout(fun(),0)  
 // 异步任务,被放入event table, 0秒之后被推入event queue里
console.log(3) // 同步任务进入主线程

为什么setTimeout的延迟时间是0毫秒却在最后执行的???

1、3是同步任务马上会被执行,执行完成之后主线程空闲去event queue(事件队列)里查看是否有任务在等待执行.

node.js 有所体现~~~???

node.js的事件循环(eventloop)是怎么运作的?

  • 1、每个Node.js进程只有一个主线程在执行程序代码,形成一个执行栈(execution context stack)。
  • 2、主线程之外,还维护了一个"事件队列"(Event queue)。当用户的网络请求或者其它的异步操作到来时,node都会把它放到Event Queue之中,此时并不会立即执行它,代码也不会被阻塞,继续往下走,直到主线程代码执行完毕。
  • 3、主线程代码执行完毕完成后,然后通过Event Loop,也就是事件循环机制,开始到Event Queue的开头取出第一个事件,从线程池中分配一个线程去执行这个事件,接下来继续取出第二个事件,再从线程池中分配一个线程去执行,然后第三个,第四个。主线程不断的检查事件队列中是否有未执行的事件,直到事件队列中所有事件都执行完了,此后每当有新的事件加入到事件队列中,都会通知主线程按顺序取出交EventLoop处理。当有事件执行完毕后,会通知主线程,主线程执行回调,线程归还给线程池。

  • 4、主线程不断重复上面的第三步。

image.png

异步函数这么多,处理起来是不是麻烦???这时候有 async await 解决这类问题???

什么是 async 函数

一句话,它就是 Generator 函数的语法糖。

院一峰老师es6文中,

const fs = require('fs');

const readFile = function (fileName) {
   
   
  return new Promise(function (resolve, reject) {
   
   
    fs.readFile(fileName, function(error, data) {
   
   
      if (error) return reject(error);
      resolve(data);
    });
  });
};

const gen = function* () {
   
   
  const f1 = yield readFile('/etc/fstab');
  const f2 = yield readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

上面代码的函数gen可以写成async函数,就是下面这样。

const asyncReadFile = async function () {
   
   
  const f1 = await readFile('/etc/fstab');
  const f2 = await readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

一比较就会发现,async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,仅此而已.

new Promise(function (resolve) {
   
    
    console.log('1')// 宏任务一
    resolve()
}).then(function () {
   
   
    console.log('3') // 宏任务一的微任务
})
setTimeout(function () {
   
    // 宏任务二
    console.log('4')
    setTimeout(function () {
   
    // 宏任务五
        console.log('7')
        new Promise(function (resolve) {
   
   
            console.log('8')
            resolve()
        }).then(function () {
   
   
            console.log('10')
            setTimeout(function () {
   
     // 宏任务七
                console.log('12')
            })
        })
        console.log('9')
    })
})
setTimeout(function () {
   
    // 宏任务三
    console.log('5')
})
setTimeout(function () {
   
     // 宏任务四
    console.log('6')
    setTimeout(function () {
   
    // 宏任务六
        console.log('11')
    })
})
console.log('2') // 宏任务一

全部的代码作为第一个宏任务进入主线程执行。
首先输出1,是同步代码。then回调作为微任务进入到宏任务一的微任务队列。
下面最外层的三个setTimeout分别是宏任务二、宏任务三、宏任务四按序排入宏任务队列。
输出2,现在宏任务一的同步代码都执行完成了接下来执行宏任务一的微任务输出3。 第一轮事件循环完成了
现在执行宏任务二输出4,后面的setTimeout作为宏任务五排入宏任务队列。 第二轮事件循环完成了
执行宏任务三输出5,执行宏任务四输出6,宏任务四里面的setTimeout作为宏任务六。
执行宏任务五输出7,8。then回调作为宏任务五的微任务排入宏任务五的微任务队列。
输出同步代码9,宏任务五的同步代码执行完了,现在执行宏任务五的微任务。
输出10,后面的setTimeout作为宏任务七排入宏任务的队列。 宏任务五执行完成了,当前已经是第五轮事件循环了。
执行宏任务六输出11,执行宏任务七输出12。

相关文章
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
4334 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
前端开发 JavaScript 应用服务中间件
花十分钟将vue3前端项目一步一步自动化部署到linux的docker上
可以理解成镜像是 Docker 生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。
3000 0
商密算法SM2、SM3、SM4的用途和原理
国产商密算法是我国自主研发、具有自主知识产权的一系列密码算法,具有较高安全性,由国家密码局公开并大力推广。
18578 0
|
关系型数据库 虚拟化
|
20天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34899 55
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
15天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
13875 42
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
3天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
|
10天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
2790 28