zoukankan      html  css  js  c++  java
  • 了解使用web workers

    Web Workers多线程的介绍与使用

    什么是Web Workers

    Web Workers是HTML5提供的一个JavaScript的多线程解决方案

    我们可以将一些计算量大的程序交给Web Workers执行,不至于让主线程由于一直在计算(被占用)而导致这个见面被冻结,用户的其他交互操作无法响应,从而解放主线程

    注意: Web Workers的子线程完全受到主线程的控制,且子线程无法操作DOM,所以JavaScript是单线程非阻塞语言的特性没有改变

    如何使用Web Workers

    主要用到的API

    // 创建web workers实例
    const worker = new Worker(path)
    
    // 向另一个线程发送数据
    worker.postMessage(data)
    
    // 得到数据后执行的回调函数
    worker.onmessage = function () {}
    

    首先需要我们创建一个js文件,这个文件用于定义Web Workers

    /* 这个worker.js文件就会作为分线程 */
    
    // onmessage是用于接收到来自主线程的数据时,执行的回调函数
    var onmessage = function (e){
        console.log(`分线程接收到主线程的数据: ${e.data}`)
        var number = e.data
        var result = fibonacci2(number)
        console.log(`计算完毕,分线程向主线程的发送数据中... ${result}`)
        postMessage(result) // 计算完毕后通过postMessage()向主线程发送数据
    }
    
    
    // 计算模块
    function fibonacci2(number) {
        if (number <= 2 ){
            return 1
        }else{
            return fibonacci2(number-1) + fibonacci2(number-2)
        }
    }
    

    主线程中我们需要创建web workers实例,并向分线程传递其需要计算的数据

    <body>
        <input type="text" placeholder="数值">
        <button>计算</button>
    
        <script>
            const input = document.getElementsByTagName('input')[0]
            const button = document.getElementsByTagName('button')[0]
    
            // 在当前的主线程中定义一个worker实例
            const worker = new Worker('worker.js')
            button.onclick = function () {
                var number = input.value
                if(number){
                    //console.log(fibonacci2(number)) // 这一步的计算量是最大的,所以需要把它交给分线程处理
    
                    console.log(`主线程向分线程发送数据中...`)
                    // 向分线程发送需要计算的数据
                    worker.postMessage(number)
    
                    // 接收到来自分线程的数据时,才执行的回调函数
                    worker.onmessage = function (e){
                        console.log(`主线程接收到来自分线程的数据: ${e.data}`)
                    }
                }
            }
        </script>
    </body>
    

    有人可能注意到,worker.js中的onmessage回调和postMessage()都是全局对象的方法,这就需要我们来看看它的的this了

    // 在worker.js中
    console.dir(this)   // 全局对象为DedicatedWorkesGlobalScope
    

    分线程的worker拥有其自己的全局对象

    分线程中由于全局对象不再是window,所以像alert()这些属于全局对象window中的方法是不能调用的

    设计者这样做的目的就是为了让分线程只是为主线程服务,而并非替换主线程

  • 相关阅读:
    结对第一次—疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    Luogu P3975 [TJOI2015]弦论
    【模板】后缀自动机 (SAM)
    停用FF新鲜事/FF新推荐
    模板汇总
    Luogu P4467 [SCOI2007]k短路(模板)
    【模板】 最短路
    Luogu P5960 【模板】差分约束算法
  • 原文地址:https://www.cnblogs.com/fitzlovecode/p/jsadvanced14.html
Copyright © 2011-2022 走看看