当前位置:首页 > javascript > 正文内容

JS 多线程 web worker 基本使用

hxing6416个月前 (01-16)javascript4155

简介:

JS 是单线程,所有的任务都是在一个线程中完成的,也就是说,只能同时执行一个任务,因此有时多个任务同时进行的时候,会阻塞,比如UI会一直在渲染,同时还要进行复杂逻辑的处理,这时候我们就要使用多线程 worker


Worker的作用:

就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。


下面是 JavaScript Worker 的详细使用步骤:

创建 Worker 对象

在主线程中创建 Worker 对象,传入一个 JavaScript 文件的 URL,该文件会在 Worker 线程中运行。

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


创建 Message 事件监听器

在主线程中为 Worker 对象添加 message 事件监听器,用于接收 Worker 线程发送的消息。

worker.addEventListener('message', (event) => {
  console.log('Received message from worker:', event.data);
});


发送消息给 Worker 线程

在主线程中通过 postMessage() 方法向 Worker 线程发送消息。

worker.postMessage({type: 'calculate', data: [1, 2, 3]});


在 Worker 线程中处理消息

在 Worker 线程中为 self 对象添加 message 事件监听器,用于接收主线程发送的消息。

self.addEventListener('message', (event) => {
  if (event.data.type === 'calculate') {
    const result = calculate(event.data.data);
    self.postMessage({type: 'result', data: result});
  }
});
function calculate(data) {
  return data.reduce((a, b) => a + b);
}


发送消息给主线程

在 Worker 线程中通过 postMessage() 方法向主线程发送消息。

self.postMessage({type: 'result', data: result});


需要注意的是,Worker 线程中不能直接操作 DOM,因为它们没有访问主线程的权限。如果需要操作 DOM,可以在 Worker 线程中处理数据,然后将处理结果通过 postMessage() 方法发送给主线程,在主线程中更新 DOM。


除了使用 JavaScript 文件创建 Worker 对象,还可以使用 Blob 对象或者 Data URL 创建 Worker 对象。Blob 对象可以动态生成 JavaScript 代码,Data URL 可以将 JavaScript 代码转换为 Base64 编码,并以字符串形式传递给 Worker 对象。


扫描二维码推送至手机访问。

版权声明:本文由星星博客发布,如需转载请注明出处。

本文链接:https://www.xingxinghan.cn/?id=514

分享给朋友:

“JS 多线程 web worker 基本使用” 的相关文章

JavaScript中的call、bind和apply方法深度解析

JavaScript是一种动态的、强大的编程语言,它的灵活性源于其独特的函数调用方式。在JavaScript中,我们常常会遇到三个非常重要的函数方法:call、bind和apply。这些方法都是用来改变函数运行时this的指向的。理解它们的工作原理和使用场景,对于我们编写高质量的Java...

7个Js async/await高级用法

JavaScript的异步编程已经从回调(Callback)演进到Promise,再到如今广泛使用的async/await语法。后者不仅让异步代码更加简洁,而且更贴近同步代码的逻辑与结构,大大增强了代码的可读性与可维护性。在掌握了基础用法之后,下面将介绍一些高级用法,以便充分利用async/awai...

JS数组常用方法

JS数组常用方法

JS数组常用方法:1.数组的复制和填充批量复制方法 copyWithin(),以及填充数组方法fill()。这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。使用这个方法不会改变数组的大小。 1.1.fill()方法使用fill()方法可以向一个已...

微信小程序如何下载外部文件

小程序下载文件主要是通过转发文件到聊天进行转存,以下为具体实现代码,可以直接拿去用,传入下载的url:const download = (url) => {   var that = this...

typescript 中 omit 的理解

在 TypeScript 中,Omit 是一种非常有用的工具类型,它可以用于创建一个新的类型,这个新类型是从现有类型中排除了指定的属性后得到的。如果你想要处理一个对象但又不需要包含某些属性,那么 Omit 可以帮助你快速地创建一个新的类型。 比如说,...

微前端使用: qiankun

微前端使用: qiankun

一、qiankun使用场景1. 简介qiankun是在single-spa的基础上实现的,可以保证各个项目独立使用,也可以集成使用。各系统之间不受技术栈的限制,集成使用也能保证各样式和全局变量的隔离。模块的插拔式使用,当公司项目集是一个大系统下包含多个子系统或者模块时,可以采用这种方式动态部署各个系...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。