JavaScript Web Workers使用流程

背景

Web Workers是一个API,允许在浏览器中运行后台处理任务,而不影响用户界面(UI)线程的稳定性。

Web Workers 可用于消除阻止 UI 的耗时任务,如图表生成,物理模拟或数据分析等:

使用 Web Workers

启动和终止

一个web worker 由一个文件创建,它正常情况下位于主线程之外。可以使用 JavsScript 的 Worker() 构造函数来创建并启动 Worker:

const worker = new Worker('worker.js');

要终止 Worker,请使用 terminate() 方法:

worker.terminate();

通信

Web workers 使用 消息传输 机制 (message-passing mechanism) 来与主线程进行通信:

  • 主线程可以通过 postMessage() 方法将消息发送给 Worker:

worker.postMessage('Hello World!');
  • Worker 可以使用 onmessage 处理函数来接受主线程发送的消息:
worker.onmessage = function(event) {
  console.log(event.data); // Prints 'Hello Worker!'
});

示例

以下代码演示了如何使用 web workers 运行一个耗时任务:

主文件(main.js)

var worker = new Worker('worker.js');

// Send a message to the worker
worker.postMessage('start');

// Handle messages sent by the worker
worker.onmessage = function(event) {
  console.log('Received message from worker', event.data);
};

工作者文件(worker.js)

// Receive messages from the main script
onmessage = function(event) {
  if (event.data == 'start') {
    // Run expensive task
    var result = doExpensiveTask();    
    // Send message to main script 
    postMessage(result);
  }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Web Workers 是 HTML5 标准中引入的一项技术,它允许在浏览器中启动后台线程来执行 JavaScript 代码,从而避免阻塞 UI 线程。因为 UI 线程的阻塞可能会导致页面卡顿或者无响应,所以 Web Workers 在一些需要执行复杂计算或者大量数据处理的场景中非常有用。 要使用 Web Workers,您需要创建一个新的 JavaScript 文件,然后在主线程中使用 `new Worker()` API 创建一个 Worker 实例。Worker 实例中的代码将在后台线程中执行,而主线程可以继续执行其他任务。 以下是使用 Web Workers 计算 CPU 使用率的示例代码: 1. 创建一个新的 JavaScript 文件,例如 `cpu-worker.js`,并将以下代码复制进去: ```javascript let startUsage = null; let startTime = null; self.addEventListener('message', (event) => { if (event.data === 'start') { startUsage = performance.now(); startTime = Date.now(); setTimeout(calculateCpuUsage, 1000); } }); function calculateCpuUsage() { const endUsage = performance.now(); const endTime = Date.now(); const usedTime = endUsage - startUsage; const elapsedTime = endTime - startTime; const cpuUsage = (usedTime / 1000 / elapsedTime) * navigator.hardwareConcurrency * 100; self.postMessage(cpuUsage.toFixed(2)); } ``` 2. 在 HTML 页面中创建一个按钮,并添加以下代码: ```javascript const cpuWorker = new Worker('cpu-worker.js'); // 监听 Web Worker 的消息事件,输出 CPU 使用率 cpuWorker.addEventListener('message', (event) => { console.log(`CPU Usage: ${event.data}%`); }); // 点击按钮时启动 Web Worker 来计算 CPU 使用率 document.querySelector('#start-button').addEventListener('click', () => { cpuWorker.postMessage('start'); }); ``` 在上面的代码中,我们创建了一个名为 `cpu-worker.js` 的文件,其中定义了一个 `calculateCpuUsage()` 函数来计算 CPU 使用率。这个函数会在 1 秒后被调用,并根据 Performance API 和 navigator.hardwareConcurrency 属性来计算 CPU 使用率。 在 HTML 页面中,我们创建了一个按钮,并在按钮点击事件中启动了 Web Worker。当 Web Worker 计算出 CPU 使用率后,会通过 `postMessage()` 方法发送消息给主线程,主线程则在监听到消息事件后输出 CPU 使用率。 请注意,由于 Web Workers 是在后台线程中执行,因此它们无法访问 DOM 和其他浏览器 API。如果您需要在 Web Worker 中进行网络请求或者其他浏览器操作,可以考虑使用 `importScripts()` 函数来导入其他 JavaScript 文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值