线程、线程池、异步
目录
什么是线程
什么是线程池
什么是异步
异步与线程关系
JS中的异步
什么是线程
线程 Thread 是计算机执行的最小单位,是 进程 内的一个实体,可以被操作系统独立调用和执行
线程可以理解为进程内的“程序执行流”,一个进程可以包含多个线程,所有线程共享该进程的资源,但每个线程都有自己的执行堆栈和程序计数器
多线程可以并行执行
在浏览器环境(多线程)中, JS (单线程)通常运行在 主线程(UI线程)上,浏览器还有渲染线程、网络线程、Web Worker 线程(允许JS在后台运行不阻塞UI)
一般浏览器的多 进程 架构:
1.浏览器主进程:负责UI交互、子进程管理等等
2.渲染进程:负责处理HTML、CSS、JS的解析,JS一般就是这里面的主进程
3.网络进程:处理网络请求
4.GPU进程:处理图形绘制
5.插件进程:运行浏览器插件
什么是线程池
线程池是一种线程使用模式,预先创建一定数量的线程,然后重复使用这些线程执行任务,而不是为了每个任务创建和销毁线程
在需要执行任务时从池中取出一个空闲线程来执行,任务完成后不会消毁,而是返回池中
主要组成部分
线程集合
任务队列
线程管理机制
线程池优势
不用频繁创建和销毁线程,提高效率
就像先开了一个静态数组一样,可以提高资源的管理性
提高响应速度
在浏览器中的应用
网络线程池:处理多个并发网络请求
工作线程池:处理后台任务
渲染线程池:用于页面渲染
什么是异步
异步是一种程序执行的模式,它允许程序在等待某个操作完成的同时继续执行其他代码,而不是等待该操作完成,在异步操作完成后,程序会得到通知(通常是回调函数、Promise、async/await)
同步是像队列一样一步步执行,如果某个操作耗时过长,会导致阻塞
使用异步提高效率的同时,可能也会因为回调导致代码复杂性提高,不易维护
异步与线程关系
异步是目的,线程是实现手段,比如构造线程池
异步不局限于线程:
硬件级异步:如DMA(直接内存访问)技术允许硬件设备独立完成数据传输,无需CPU干预
系统级异步:比如windows的IOCP(IO完成端口)
单线程异步:比如JS、Go的协同等,通过任务调度(外部)在单线程内实现异步
在异步框架(如 Node.js )中,主线程处理I/O回调,计算密集型任务仍然在工作线程执行
JS中的异步
JS是单线程主要是为了简化DOM操作,防止多个线程同时修改DOM
JS作为单线程语言,如果不使用异步会导致阻塞
于是JS利用浏览器内置的多线程功能,加上事件循环和回调队列的协作来实现
1.回调函数
setTimeout(() => {console.log("这段代码会在3秒后执行");
}, 3000);
2.Promise
fetch('https://api.example.com/data').then(response => response.json()).then(data => console.log(data)).catch(error => console.error('出错了:', error));
3.Async/Await
async function fetchData() {try {const response = await fetch('https://api.example.com/data');const data = await response.json();console.log(data);} catch (error) {console.error('出错了:', error);}
}
还有像事件监听器就是一个异步例子,它在浏览器主线程上注册