Web Worker

116 阅读1分钟

简单示例

  • 耗时任务:输入一个值,得到0到这个值的和
  • 同步按钮:执行两次耗时任务,展示二者之和,得到计算时间syncCost
  • worker按钮:主线程执行一次耗时任务,worker线程执行一次,展示二者之和,得到计算时间workerCost

index.html,ui页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="number">
    <div>
        <span>计算结果为:</span>
        <h2 class="result"></h2>
    </div>
    <button class="syncBtn">sync calculate</button>
    <button class="workerBtn">worker calculate</button>
    <script src="./index.js"></script>
</body>
</html>

主线程index.js

/**
 * 模拟耗时任务:输入一个值,得到0到这个值的和
 * 同步按钮:执行两次耗时任务,展示二者之和,得到计算时间syncCost
 * worker按钮:主线程执行一次耗时任务,worker线程执行一次,展示二者之和,得到计算时间workerCost
 */
const syncBtn = document.querySelector('.syncBtn');
const workerBtn = document.querySelector('.workerBtn');

const input = document.querySelector('input');
const resultArea = document.querySelector('.result');

const worker = new Worker('./worker/index.js')

let result = 0;

syncBtn.addEventListener('click', function() {
    console.time('syncCost');
    result += costFn(input.value);
    result += costFn(input.value);
    console.timeEnd('syncCost');
});

workerBtn.addEventListener('click', function() {
    console.time('workerCost')
    worker.postMessage(input.value);
    result = costFn(input.value);
});

worker.onmessage = (e) => {
    result += e.data;
    resultArea.innerText = result;
    console.timeEnd('workerCost');
}

const costFn = (num) => {
    let result = 0;
    for(let i = 0; i < num; i++) {
        result += i;
    }
    return result
}

worker线程 worker/index.js

onmessage = (e) => {
    console.log('message recived form main script', e.data);
    const result = costFn(e.data);
    postMessage(result);
}

const costFn = (num) => {
    let result = 0;
    for(let i = 0; i < num; i++) {
        result += i;
    }
    return result
}

使用worker线程几乎只有同步计算的一半耗时