前言:众所周知,js是一门单线程语言,无法像java、c++等语言同一时刻执行多个线程的代码。但是,web works的出现,打破了这一现象,也能让我们的js代码在多个线程中同步执行了。web works到底是何方神圣? 就让我们一探究竟。
1、web works是什么?
本质上,web works是一个构造函数,可以用其来生成worker实例。实例将会包含一个将要执行的js代码文件,代码将会运行在主线程之外的其他线程中。也就是说,主线程在运行任务的同时,我们的 worker实例可以同时执行其他的代码。但是worker执行的结果最终还是要返还给主线程,由主线程处理,并且worker实例中的js代码不能直接操作界面的dom对象。
2、为什么?
对于一些计算较为密集型的场景,如果直接由主线程处理,可能会出现界面卡顿现象。原因是浏览器js执行与界面渲染时互斥的,一帧当中若执行的js代码时间过长,就会导致留给渲染的时间不够。渲染操作将被迫被放到下一帧才能执行完毕。 web workers可以将一些计算密集型的操作提取出来,充分发挥多核cpu的优势,将密集型的计算放在其他线程中处理,这样就不会影响到主线程的渲染,等到其他线程计算出结果,再将计算结果提交给主线程,由主线程处理。
3、怎么用?
// main.js
// 生成一个worker实例
const worker = new Wprker('woker.js');
// 主线程监听worker发送的消息
worker.onmessage = e => {
console.log('e', e);
};
// 主线程给worker发消息
worker.postMessage = e => {
console.log('e', e);
};
// 终止worker
worker.terminate();
// worker.js
onmessage = e => {
const result = null;
// 将结果回传给主线程
postMessage(result);
};