JS—异步编程:3分钟掌握异步编程
个人博客:haichenyi.com。感谢关注
一. 目录
- 一–目录
- 二–引言
- 三–JavaScript 事件循环机制
- 四–定时器的秘密:setTimeout 和 setInterval
- 五–异步编程模型对比
二. 引言
在现代Web开发中,异步编程是提升性能的关键技术。无论是脚本加载,用户交互,网络请求,异步编程都是贯穿始终的。上一篇博客已经说了异步加载JavaScript脚本的async和defer了。本文在深入讲解一下异步编程。
三.JavaScript 事件循环机制
3.1 单线程与任务队列
JavaScript 运行时环境的核心结构如下:
3.2 微任务 vs 宏任务
类型 | 示例 | 优先级 | 执行时机 |
---|---|---|---|
微任务 | Promise.then() | 高 | 当前宏任务结束后立即执行 |
宏任务 | setTimeout、DOM 事件 | 低 | 下一轮事件循环 |
3.3 执行流程详解
- 同步代码入栈执行
- 所有同步代码按顺序入**调用栈(Call Stack)**执行
- 遇到异步API(如setTimeout,pormise等),交给浏览器内核处理
- 异步任务完成后回调分发
- 宏任务(如setTimeout回调)推入宏任务队列
- 微任务(如promise.then())推入微任务队列
- 事件循环规则
- 单次循环(Tick)的步骤
- 1.执行调用栈中的同步代码,只到栈空
- 2.清空微任务队列 中的所有任务(按入队顺序执行)
- 3.渲染页面(如果需要的话)
- 4.从宏任务队列 取出第一个任务 推入调用栈执行
- 5.重复执行
- 单次循环(Tick)的步骤
3.4 示例代码与执行过程
console.log("Script Start"); // 同步任务
setTimeout(() => console.log("Timeout"), 0); // 宏任务
Promise.resolve().then(() => console.log("Promise 1")) // 微任务.then(() => console.log("Promise 2")); // 微任务
console.log("Script End"); // 同步任务
执行步骤分解:
1. 同步代码执行
Call Stack: [main]→ 打印 "Script Start"→ 注册 `setTimeout`(交给浏览器计时模块)→ 注册 `Promise.then()`(微任务入队)→ 打印 "Script End"
2.清空微任务队列
Microtask Queue: [Promise 1]
→ 执行 `Promise 1`,打印 "Promise 1"
→ 注册下一个 `then()`(微任务入队)
→ Microtask Queue: [Promise 2]
→ 执行 `Promise 2`,打印 "Promise 2"
3.取出宏任务执行
Macrotask Queue: [Timeout]
→ 执行 `Timeout`,打印 "Timeout"
4.最终输出
Script Start
Script End
Promise 1
Promise 2
Timeout
四.定时器的秘密:setTimeout 和 setInterval
4.1 最小延迟的真相
场景 | 最小延迟 | 原因 |
---|---|---|
未嵌套调用 | 1ms | 浏览器优化策略 |
嵌套超过 5 层 | 4ms | 防止无限循环阻塞 |
后台标签页 | ≥1000ms | 浏览器节流(Chrome 为例) |
PS:这种值都不准确,都是需要根据实际的场景来的。
测试代码:
const start = performance.now();
setTimeout(() => {console.log(`实际延迟: ${performance.now() - start}ms`);
}, 0);
4.2 setInterval 的陷阱
// 问题:回调执行时间超过间隔会导致堆积
setInterval(() => {heavyTask(); // 假设耗时 15ms
}, 10);// 解决方案:递归 setTimeout + 动态补偿
function recursiveCall() {setTimeout(() => {heavyTask();recursiveCall();}, 10);
}
五.异步编程模型对比
异步编程,并发,并行。有没有想过到底是什么?cpu就像我们的大脑,我们同时只能思考一件事情,为什么一个cpu就能实现"并发"?多任务"同时执行"?
这个"并发"?真的是我们以为的并发吗?多任务"同时执行"真的是我们认为的"同时执行"吗?答案是否定的,不是
让我们来走进并发的世界,世界是一个巨大的草台班子。
我们认定一件事情:我们一个脑袋,同时只能思考一个问题,不能思考多个问题。CPU也是一样的,一个CPU同时只能执行一个指令,同时发多个指令只能排队执行。
那么,问题就来了,这个并发,多线程是怎么实现的呢?只要把时间分的足够的小,"同一时间"能执行的任务就能足够的多,这样就能达到"并发"的目的。 怎么理解这句话呢?
举个栗子:
- 我们之前上学的时候,一上午4节课,每节课40分钟,我们一上午就是上完第一节语文课,上第二节数学课,上第三节英语课,上第四节物理课。以40分钟为一个时间片,按照顺序上课。
- 我要是以20分钟为一个时间片呢?上20分钟语文,上20分钟数学,上20分钟英语,上20分钟物理。然后,循环一次。最终语文花了40分钟,数学花了40分钟,英语花了40分钟,物理花了40分钟,还是花了相同的时间,完成了同样的事情。
- 要是时间片再短一点呢?上1分钟语文,上1分钟数学,上1分钟英语,上1分钟物理。循环40次
- 要是时间片再短一点呢?上1秒钟语文,上1秒钟数学,上1秒钟英语,上1秒钟物理。循环40*60次
- 要是时间片再短一点呢?上1毫秒语文,上1毫秒数学,上1毫秒英语,上1毫秒物理。循环40601000次
- 要是再短一点呢?
可能,你会说1分钟都学不到东西了,更别说1秒,1毫秒了,能学什么东西?诶,这就是区别,机器能记住上一次执行的状态,下次再接着执行,不要杠,不接受反驳。
并发的底层原理就行,把一个任务分割成足够小的时间块, 比方说你的任务A完成需要0.5秒钟,任务B完成需要0.5秒。例如,把任务A分成5次执行,每次消耗0.1秒,任务B也是同样。可能,CPU干了0.1秒的任务A,然后干0.2秒的任务B。具体的执行顺序,是CPU调度的。反正,总耗时是1秒钟,完成了任务A和任务B。在人类看来,1秒钟完成了两个任务,并发执行的。这就是并发。
以上,我说的都是单核,也就是1个CPU,现在手机,电脑都是4核,8核。这就设计另一个名词了:并行,并行才能我们所理解的"并发",才是真正的并发。多个任务同时执行,不存在时间片轮转
说了这么多,总结一下:精华
说了这么多,总结一下:精华
说了这么多,总结一下:精华
- 同步 vs 异步(编程模型视角)
- 同步(Synchronous)代码顺序执行,每一步操作必须等待前一步完成。
- 特点:逻辑简单直观,但会阻塞后续操作。
- 异步(Asynchronous)代码不按顺序等待,通过回调、事件循环或线程调度等方式,让耗时操作在后台执行,主流程继续运行。
- 特点:提升吞吐量,避免阻塞,但逻辑复杂度高。
- 同步(Synchronous)代码顺序执行,每一步操作必须等待前一步完成。
- 并发 vs 并行(CPU 执行视角)
- 并发(Concurrency)单核 CPU 上通过时间片轮转,让多个线程交替执行,看似“同时”运行(实际是快速切换)。
- 本质:通过调度策略模拟多任务,例如线程切换、协程(Coroutine)。
- 并行(Parallelism)多核 CPU 上真正同时执行多个线程,每个核心独立处理任务。
- 本质:硬件层面的同时执行。
- 并发(Concurrency)单核 CPU 上通过时间片轮转,让多个线程交替执行,看似“同时”运行(实际是快速切换)。
对比项 | 并发 | 并行 |
---|---|---|
依赖条件 | 单核即可 | 需多核 CPU |
执行方式 | 时间片轮转(交替执行) | 多核同时执行 |
编程模型 | 多线程、协程 | 多线程、分布式计算 |
- Java 多线程的底层实现
- 单核 CPU
- 多线程通过 时间片轮转(Time Slicing) 实现并发。
- 每个线程获得极短的 CPU 时间片(如 10ms),快速切换,用户感知为“异步”。
- 本质:调度策略的同步切换,但宏观上表现为异步行为。
- 多核 CPU
- 线程可分配到不同核心,实现 真正并行。
- 例如:4 核 CPU 可同时运行 4 个线程,其余线程仍依赖时间片轮转。
- 单核 CPU
- 异步编程 ≠ 多线程
- 多线程是实现异步的一种方式,但异步编程模型更抽象:
- 回调(Callback):单线程下通过事件循环处理异步(如 JavaScript)。
- Future/Promise:封装异步操作结果(如 Java 的 CompletableFuture)。
- 协程(Coroutine):轻量级线程,由用户态调度(如 Kotlin 协程)
- 示例:Java 的 NIO(Non-blocking I/O)
使用单线程事件循环处理网络请求,通过 非阻塞 I/O 和 就绪选择(Selector) 实现高并发,无需多线程。
- 多线程是实现异步的一种方式,但异步编程模型更抽象:
再回到本篇的开头,JavaScript的异步编程,就可以理解为,单核CPU的并发,通过时间片的轮转方式去调度任务。任务怎么调度?再看一下单线程与任务队列。这样就串起来了。
相关文章:
JS—异步编程:3分钟掌握异步编程
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–引言三–JavaScript 事件循环机制四–定时器的秘密:setTimeout 和 setInterval五–异步编程模型对比 二. 引言 在现代Web开发中,异步编程是提升性能的关键技术。无论是脚本加载&am…...
Linux C语言调用第三方库,第三方库如何编译安装
在 Linux 环境下使用 C 语言调用第三方库时,通常需要先对第三方库进行编译和安装。以下为你详细介绍一般的编译安装步骤,并给出不同类型第三方库(如使用 Makefile、CMake 构建系统)的具体示例。 一般步骤 1. 获取第三方库源码 …...
gogs私服搭建
一.介绍: gogs是一个用Go语言开发的自助Git服务,目标是简单、快速搭建Git服务, 支持多种平台,包括Linux、Windows等。它类似于GitHub,但更轻量,适合个人或小团队使用, 在简化git服务搭建流程的…...
python和c中作用域的差异
好的,我将详细列举 Python 和 C 语言在作用域规则上的主要差异,并为每种差异提供具体的代码示例,以便更清晰地理解它们之间的不同。 1. 块级作用域(Block Scope) C 语言 在 C 语言中,任何用 {} 包裹的代…...
C++ 中将函数作为参数传递
C 中将函数作为参数传递 1. 通过指针传递函数 函数可以通过传递函数的地址来作为参数传递;简而言之,就是通过指针实现这一点。 示例代码 #include <iostream> using namespace std;// 定义加法和减法函数 #include <iostream> #include …...
【C++】右值引用与完美转发
目录 一、右值引用: 1、左值与右值: 2、左值引用和右值引用: 二、右值引用的使用场景: 1、左值引用的使用场景: 2、右值引用的使用场景: 移动构造 移动赋值 三、完美转发: 1、万能引用…...
批量合并 PDF 文档,支持合并成单个文档,也支持按文件夹合并 PDF 文档
在日常工作中,合并多个 PDF 文档为一个文件是非常常见的需求。通过合并 PDF,不仅能够更方便地进行管理,还能在特定场景下(如批量打印)提高效率。那么,当我们需要批量合并多个 PDF 文件时,是否有…...
SQL Server 备份相关信息查看
目录标题 一、统计每个数据库在不同备份目录和备份类型下的备份次数,以及最后一次备份的时间整体功能详细解释 二、查询所有完整数据库备份的信息,包括备份集 ID、数据库名称、备份开始时间和备份文件的物理设备名称,并按备份开始时间降序排列…...
Flutter_学习记录_AppBar中取消leading的占位展示
将leading设置为null将automaticallyImplyLeading设置为false 看看automaticallyImplyLeading的说明: Controls whether we should try to imply the leading widget if null. If true and [AppBar.leading] is null, automatically try to deduce what the leading…...
多省发布!第27届中国机器人及人工智能大赛各赛区比赛通知
01 大赛介绍 中国机器人及人工智能大赛是由中国人工智能学会主办的极具影响力的全国性学科竞赛,旨在推动我国机器人及人工智能技术的创新与应用,促进相关专业的人才培养。作为全国高校学科竞赛A类赛事,该比赛吸引了众多高校和科研机构的积极…...
leetcode199 二叉树的右视图
小问题:if(!q.empty()) 这个条件会导致只处理一层,而不会处理所有层。正确的做法应该是用 while(!q.empty()) 循环处理每一层。 class Solution { public:vector<int> rightSideView(TreeNode* root) {vector<int> res;queue<TreeNode…...
大模型评测框架evalscope、openCompass
一、evalscope使用说明 1、如何使用智增增的接口: VLLM_USE_MODELSCOPETrue evalscope eval \--model qwen2.5-14b-instruct \--api-url https://api.zhizengzeng.com/v1/chat/completions \--api-key skxxx \--eval-type service \--datasets gsm8k \--limit 10 …...
接口自动化——初识pytest
缩写单词含义.passed通过Ffailed失败(用例执行时报错)Eerror出错(fixture执行报错)sskipped跳过Xxpassed预期外的通过(不符合预期)xxfailed预期内的失败(符合预期) 1.pytest 配置 1…...
SkyWalking实战
1、下载SkyWalking APM 1.手动下载 Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/ 2.链接下载 https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gzhttps://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-…...
游戏AI实现-GOAP
GOAP原理: GOAP(面向目标的行动规划,Goal - Oriented Action Planning) 旨在让智能体通过选择一系列行动来达成特定目标。它基于对世界状态的理解,每个行动都有前提条件和效果。智能体通过分析当前世界状态与目标状态…...
Baklib内容中台的核心优势是什么?
智能化知识管理引擎 Baklib的智能化知识管理引擎通过多源数据整合与智能分类技术,实现企业知识资产的自动化归集与动态更新。系统内置的语义分析算法可自动识别文档主题,结合自然语言处理技术生成结构化标签体系,大幅降低人工标注成本。针对…...
windows第二十章 单文档应用程序
文章目录 单文档定义新建一个单文档应用程序单文档应用程序组成:APP应用程序类框架类(窗口类)视图类(窗口类,属于框架的子窗口)文档类(对数据进行保存读取操作) 直接用向导创建单文档…...
eBay多账号安全运营技术体系:从环境隔离到智能风控的工程化实践
一、多账号运营风险模型解析 (技术化重构关联检测机制) 环境指纹维度: 浏览器指纹参数:Canvas/WebGL渲染特征(差异度要求≥98%) 设备指纹参数:GPU型号/声卡特征(识别准确率92%&…...
《Python Web网站部署应知应会》No4:基于Flask的调用AI大模型的高性能博客网站的设计思路和实战(上)
基于Flask的调用AI大模型的高性能博客网站的设计思路和实战(上) 摘要 本文详细探讨了一个基于Flask框架的高性能博客系统的设计与实现,该系统集成了本地AI大模型生成内容的功能。我们重点关注如何在高并发、高负载状态下保持系统的高性能和…...
vulnhub-Node1
一、信息收集 1、扫靶机ip arp-scan -l 2、端口扫描 淦,只有22端口和3000端口,访问一下3000端口吧,估计是个网页 nmap -p- -Pn -sC -sV -n 192.168.66.130PORT STATE SERVICE VERSION 22/tcp open ssh OpenSS…...
什么是 OLAP 数据库?企业如何选择适合自己的分析工具
引言:为什么企业需要 OLAP 数据库? 你是否曾经经历过这样的场景: 市场部门急需一份用户行为分析报告,数据团队告诉你:“数据太大了,报表要跑 4 个小时”;业务负责人在会议中提出一个临时性分析…...
计算机视觉准备八股中
一边记录一边看,这段实习跑路之前运行完3DGAN,弄完润了,现在开始记忆八股 1.CLIP模型的主要创新点: 图像和文本两种不同模态数据之间的深度融合、对比学习、自监督学习 2.等效步长是每一步操作步长的乘积 3.卷积层计算输入输出…...
电源系统的热设计与热管理--以反激式充电器为例
前言 反激电源常用于各种电子设备中,比如充电器、适配器等,它们通过变压器进行能量转换。高温环境可能对电子元件造成影响,特别是像MOSFET、二极管、变压器这样的关键部件,导致效率变低,甚至可能导致功能失效。还有安…...
【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,并实现远程联机,详细教程
【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,详细详细教程 一、 服务器介绍二、下载 Minecraft 服务端三、安装 JDK 21四、搭建服务器五、本地测试连接六、添加服务,并设置开机自启动 前言: 推荐使用云服务器部署&…...
vue数据两个相同的参数对比只显示一个
vue数据两个相同的参数对比只显示第一个 如每条的rq0/rq1对比data() { return{dataList: [{CurrencyName: "现金",rq0: "2017-10-20 19:22:17",rq1: "2018-02-07 19:48:00",yje: -1179.8},{CurrencyName: "微支付",rq0: "2017-10…...
vue如何实现前端控制动态路由
在 Vue.js 中,动态路由是一种根据不同用户权限或其他因素动态改变路由列表的功能。这种机制允许开发者根据后端提供的权限数据动态渲染前端路由,实现多用户权限系统,不同用户展示不同的导航菜单。 动态路由的配置 动态路由的配置涉及到前端…...
开发环境部署
一、安装Django-5.0.3 1、将已下载的软件通过winscp上传至centos下 2、 安装 [root@hcss-ecs-1e19 ~]# ll total 10372 -rw-r--r-- 1 root root 10620661 Feb 10 10:16 Django-5.0.3.tar.gz [root@hcss-ecs-1e19 ~]# pip3 install Django-5.0.3.tar.gz Processing ./Django-…...
C语言入门教程100讲(0)从了解C语言的发展史开始
文章目录 引言1. C语言的起源2. C语言的诞生3. C语言的标准化4. C语言的进一步发展5. C语言的影响与应用6. C语言的未来结语引言 C语言作为一种高效、灵活且具有广泛应用的编程语言,在计算机科学史上占据着举足轻重的地位。它的设计不仅影响了后来的编程语言,也对操作系统、…...
笔记本电脑更换主板后出现2203:System configuration is invalid,以及2201、2202系统错误的解决
笔记本电脑更换主板后启动出现2203:System configuration is invalid,以及2201、2202系统错误的解决 自用的一台ThinkpadT490笔记本电脑 ,由于主板故障,不得不更换主板,通过某宝购置主板后进行了更换。 具体拆卸笔记本可搜索网络视频教程。 注意: 在更换主板时,注意先拍…...
如何为 Debian 和 Kali 系统更换软件源并更新系统
在 Linux 系统中,软件源(Software Repository)是获取软件包和更新的核心途径。然而,默认的软件源可能会因为地理位置、网络状况等原因导致下载速度缓慢,甚至无法访问。为了提升系统的软件获取效率,许多用户…...
git:远程仓库拉取到本地,fork到本地,修改后再上传
讲述仓库成员拉取远程仓库(即组长的仓库,里面有成员)到本地,修改内容再上传的详细步骤: 1.进入仓库,首先fork (如不,所作操作会直接对远程仓库进行,不用管理员审核&…...
C++ 中名字的作用域、概念、嵌套与实践(十八)
1. 名字的作用域基本概念 作用域(scope) 指的是程序中的一个区域(通常被花括号 {} 包围),在这里一个名字(如变量名、函数名、类名等)有其特定含义。 在 同一个作用域 中,一个名字只…...
Go语言nil原理深度解析:底层实现与比较规则
Go语言nil原理深度解析:底层实现与比较规则 引言 在Go语言中,nil 是一个特殊的关键字,用于表示引用类型的“零值”。它在指针、切片、映射、通道、接口和函数等类型中广泛使用。本文将从 底层实现、比较规则、与其他语言的对比 等角度&#…...
使用Java操作Redis
文章目录 常用Redis键操作命令使用Java操作Redis配置 Redis 连接信息创建 Maven 项目结构 操作字符串操作列表操作集合操作散列操作有序集合总结 报错解决办法: 当使用redis-cli连接客户端出现not connected时 使用redis-cli -h 192.168.222.101 -p 6379即可解决 …...
开源的CMS建站系统可以随便用吗?有什么需要注意的?
开源CMS建站系统虽然具有许多优点,但并非完全“随便用”。无论选哪个CMS系统,大家在使用的时候,可以尽可能地多注意以下几点: 1、版权问题 了解开源许可证:不同的开源CMS系统采用不同的开源许可证,如GPL、…...
数据结构:探秘AVL树
本节重点 理解AVL树的概念掌握AVL树正确的插入方法利用_parent指针正确更新平衡因子掌握并理解四种旋转方式:左单旋,右单旋,左右双旋,右左双旋 一、AVL树的概念 AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&…...
C++ 变量与初始化详解(十五)
1. 变量定义 在 C 中,定义变量的基本形式通常是先写出 类型说明符(type specifier),后面紧跟由逗号分隔的一个或多个变量名,最后以分号结束。简单示例如下: int sum 0, value, units_sold 0; Sales_ite…...
【网络协议详解】—— STP 、RSTP、MSTP技术(学习笔记)
一、STP技术工作原理 STP(Spanning Tree Protocol)生成树协议(IEEE 802.1D)是一种网络协议,用于在网络拓扑中防止环路的产生。在二层交换网络中,逻辑上阻塞部分接口,实现从根交换机到所有节点的…...
C++中将记录集的数据复制到Excel工作表中的CRange类CopyFromRecordset函数异常怎么捕获
文章目录 一、异常类型及捕获逻辑二、完整代码示例三、关键错误场景与解决方案1. CopyFromRecordset 返回空数据2. COM错误 0x800A03EC3. Excel进程残留4. 内存不足 四、调试与日志记录1. 启用详细日志2. 捕获错误描述3. 调试断点 五、最佳实践 在C中使用 CRange::CopyFromReco…...
综述速读|086.04.24.Retrieval-Augmented Generation for AI-Generated Content A Survey
论文题目:Retrieval-Augmented Generation for AI-Generated Content: A Survey 论文地址:https://arxiv.org/abs/2402.19473 bib引用: misc{zhao2024retrievalaugmentedgenerationaigeneratedcontent,title{Retrieval-Augmented Generation…...
对内核fork进程中写时复制的理解记录
前言 文章写于学习Redis时对aof后台重写中写时复制的疑问 一、感到不理解的歧义 在部分技术文档中(以小林的文章为例),对写时复制后的内存权限存在如歧义: ! 二、正确技术表述 根据Linux内核实现(5.15版本&#x…...
【新手初学】SQL注入getshell
一、引入 木马介绍: 木马其实就是一段程序,这个程序运行到目标主机上时,主要可以对目标进行远程控制、盗取信息等功能,一般不会破坏目标主机,当然,这也看黑客是否想要搞破坏。 木马类型: 按照功…...
【湖北工业大学2025年ACM校赛(同步赛)】题解
比赛链接 A. 蚂蚁上树 题目大意 给定一棵 n n n 个结点的树,根结点为 1 1 1。每个 叶结点 都有一只蚂蚁,每过 1 1 1 秒钟,你可以选一些蚂蚁往其 父结点 走一步,但是要求任意两只蚂蚁都不能在同一个 非根结点 上。 问至少要…...
FPGA Verilog/VHDl 中的锁存latch
目录 一、前言二、锁存器定义三、verilog中锁存的产生四、verilog中锁存的影响和消除五、FPGA中的锁存器资源 一、前言 在做FPGA设计时,我们要求在组合逻辑设计时,case或者if-else条件要完整,否则会产生锁存。本文主要介绍锁存产生的原因和影…...
Ubuntu24.04 配置远程桌面服务
一:安装 sudo apt update sudo apt install vino 二:设置 gsettings set org.gnome.Vino require-encryption false # 关闭加密(某些 VNC 客户端不支持加密) gsettings set org.gnome.Vino prompt-enabled false # 关闭连接…...
【二刷代码随想录】螺旋矩阵求解方法、推荐习题
一、求解方法 (1)按点模拟路径 在原有坐标的基准上,叠加 横纵坐标 的变化值,求出下一位置,并按题完成要求。但需注意转角的时机判断,特别是最后即将返回上一出发点的位置。 (2)按层…...
Python基础教程:从格式化到项目管理
一、Typora代码块支持格式 在Typora中编写代码时,支持多种语言的语法高亮显示: 二、代码格式化 1. %格式化(传统方式) 第一种方式:正规方式 示例代码: name "张三" age 10 print("我的…...
Python爬虫:开启数据抓取的奇幻之旅(一)
目录 一、爬虫初印象:揭开神秘面纱 二、工欲善其事:前期准备 (一)Python 环境搭建 1.下载 Python 安装包: 2.运行安装程序: 3.配置环境变量(若自动添加失败)&#x…...
分布式ID服务实现全面解析
分布式ID生成器是分布式系统中的关键基础设施,用于在分布式环境下生成全局唯一的标识符。以下是各种实现方案的深度解析和最佳实践。 一、核心需求与设计考量 1. 核心需求矩阵 需求 重要性 实现难点 全局唯一 必须保证 时钟回拨/节点冲突 高性能 高并发场景…...
浏览器与网络模块实践
浏览器渲染步骤 浏览器渲染大致分为以下四个步骤: 1. 构建 DOM 树 • 过程:当浏览器接收到 HTML 文档后,会从上到下依次解析 HTML 代码。每遇到一个开始标签,就会创建一个对应的 DOM 节点,并根据标签的嵌套关系将这些…...