文章目录
🚀前提:什么是线程?🚀
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程是独立调度和分派的基本单位。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
JavaScript单线程
JavaScript设计成单线程目的:为了防止多个线程同时操作DOM,带来渲染冲突问题。
但是遇见大量计算会使页面卡顿,用户体验不佳
就引出本篇的主题Web Worker
🚀Web Worker🚀
Web Worker
允许我们在 js 主线程之外开辟新的 Worker 线程。
因为是独立的线程,Worker 线程与 js 主线程能够同时运行,互不阻塞。
如果有大量运算任务时,可以把运算任务交给 Worker 线程去处理,当 Worker 线程计算完成,再把结果返回给 js 主线程。js主线程只用专注处理业务逻辑,Worker处理大量复杂计算,从而减少了主线程阻塞
时间,提高运行效率和提升用户体验。
Web Worker用法
const worker = new Worker(path, options);
path
js脚本的路径地址(遵守同源策略),否则会抛出SECURITY_ERR
类型错误options
type
worker 类型。该值可以是classic
或module
。 默认值classic
credentials
worker凭证。该值可以是omit
,same-origin
,或include
。默认值omit
(不要求凭证)name
主线程与Worker参数之间参数传递
index.html
const myWorker = new Worker('/worker.js');
myWorker.addEventListener('message', e => {
console.log(e.data);
});
myWorker.postMessage('这里是主线程');
worker.js
// self是worker的