七、多线程

七、多线程

7.1 线程阻塞

1
2
3
4
5
6
7
8
9
10
11
<script>
// 斐波那契函数
var fibonacci =function(n) {
return n <2 ? n : arguments.callee(n -1) +arguments.callee(n -2);
};

fibonacci(40);
// js 是单线程,当 js 在执行的时候,页面是停止渲染的
// 当上面的函数在执行的时候(在大量计算),此时用户点击页面将得不到响应(假死状态)
</script>
<button>提交</button>

U8htYj.png

7.2 Worker函数

我们希望当 js 在大量计算的时候,不要阻塞线程

H5 提供了一个 Worker 函数,可以开辟一个新的线程,用于计算

使用方式:

1
2
将要计算的代码提取出来放入一个 js文件中
初始化 Worker 函数
1
var worker = new Worker("comouted.js");  // 会报错  需要服务器环境

U843g1.png

7.3 证明是多线程

初始情况下,在定时器中不断的输出

当上面的延时器执行之后,下面的输出语句就会被阻塞

当点击掉弹出框的时候,定时其中的输出语句会接着上一次的结果继续输出

说明 alert阻塞了当前线程

1
2
3
4
5
6
7
8
9
10
// 开启延时器
setTimeout(function(){
alert(1); // alert弹出框会阻塞线程
},3000);

var i = 0;
// 开启定时器
setInterval(function(){
console.log(i++);
}, 1000);

U842VS.png

后来,我们将要计算的代码放入到另一个 js 文件中,并初始化 Worker函数用于开辟新的线程
当 3s 之后,弹出框出现,定时器中的输出语句虽然被阻塞了,但是仍会多出很多输出语句
说明主线程被阻塞了,但是有另外一个线程在计算

1
var worker = new Worker("out.js");

U8bBo6.png

7.4 postMessage

开辟的额外的线程用于计算,计算的结果可以通过postMessage向主线程推送

U8bgQH.png

1
console.log(worker);

UYYdz9.png

7.5 onmessage

额外的线程向主线程推送的消息,可以通过 onmessage来获取

1
2
3
4
// out.js 向主线程推送的消息,可以通过 onmessage来获取
worker.onmessage = function(e){
console.log(e);
}

UYt0fg.png

1
2
3
4
5
worker.onmessage = function(e){
// console.log(e);
// 具体的数据在 e.data
console.log(e.data);
}

UYthhF.png

举例(斐波那契函数):

1
2
3
4
5
6
7
8
var fibonacci =function(n) {
return n <2 ? n : arguments.callee(n -1) +arguments.callee(n -2);
};

var result = fibonacci(30);
// console.log(result); // 832040
// 将结果推送到主线程
postMessage(result);
1
2
3
4
5
worker.onmessage = function(e){
// console.log(e);
// 具体的数据在 e.data
console.log(e.data); // 832040
}
点击查看

本文标题:七、多线程

文章作者:Mango

发布时间:2020年07月14日 - 13:16:55

最后更新:2020年07月14日 - 13:27:10

原始链接:https://mango185.github.io/post/a7476252.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------