浏览器多线程——web worker

一、引入 Web Worker 的原因

  JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。随着电脑计算能力的增强,尤其是多核 CPU 的出现,单线程带来很大的不便,无法充分发挥计算机的计算能力。
  Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。
  Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。 这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。

二、Web Worker 的使用限制

  1. 同源限制

    分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。

  2. DOM 限制

    Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用 documentwindowparent 这些对象。但是,Worker 线程可以使用 navigator 对象和 location 对象。

  3. 通信联系

    Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成。

  4. 脚本限制

    Worker 线程不能执行alert()方法和confirm()方法,但可以使用 XMLHttpRequest 对象发出 AJAX 请求。

  5. 文件限制

    Worker 线程无法读取本地文件,即不能打开本机的文件系统(file://),它所加载的脚本,必须来自网络。

三、web worker的简单使用

  1. 在同一页面中使用<script>作为worker的脚本文件

    <!DOCTYPE html>
    <html>
      <head></head>
      <body>
        <button onclick="createWorker()">创建worker线程并发送消息</button>
        <script id='SCRIPT_worker'>
          // 将作为线程的程序脚本
          self.onmessage = (_e) => {
            console.log('[WORKER] received: ' + _e.data)
            self.postMessage('You said: ' + _e.data)
          }
          setTimeout(() => {
            console.log(self.name)
          }, 1000)
          setTimeout(() => {  // 不会打印,因为3000ms后该线程已经在主线程中被关闭了
              console.log(self.name)
            }, 3000)
        </script>
        <script>
          function createWorker() {
            // 使用<script>作为线程worker_1的脚本
            let blob = new Blob([document.getElementById('SCRIPT_worker').textContent])
            let url = window.URL.createObjectURL(blob)
            let worker = new Worker(url, {name: 'worker_1'})
            worker.onmessage = (_e) => {
              console.log('[MAIN] received: ' + _e.data);
            }
            worker.postMessage('Hello!')
            setTimeout(() => {
              worker.terminate()
            }, 2000)
          }
        </script>
      </body>
    </html>
    

阮一峰Web Worker使用教程

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3支持Web Worker多线程的特性,这是一种在浏览器中运行JavaScript代码的方式,可以在后台运行独立的线程,提高应用程序性能和响应能力。 在Vue 3中,可以使用`Vue. createApp()`方法创建Vue实例,并使用`createWebWorker`方法将其转换为Web Worker。这个方法接收一个参,指定Worker脚本的URL或者内联函的URL。例如: ```javascript const app = Vue.createApp({...}); const worker = app.createWebWorker('path-to-worker-script.js'); ``` 然后,可以使用`worker`对象的方法与Web Worker进行通信。例如,通过`postMessage`方法发送消息给Worker线程: ```javascript worker.postMessage({ data: 'message' }); ``` 同时,还可以通过`onmessage`事件监听来自Worker线程的消息: ```javascript worker.onmessage = function(event) { const data = event.data; // 处理接收到的消息 }; ``` 在Worker线程中,可以使用`self`关键字引用Worker对象,同样可以通过`postMessage`方法发送消息给主线程,并通过`onmessage`事件处理来自主线程的消息。 Web Worker多线程功能可以极大地提高Vue应用程序的性能和响应能力,将一些耗时的操作(如计算、渲染等)放在Worker线程中运行,避免阻塞主线程,提高用户体验。 需要注意的是,在使用Web Worker时,需要考虑到跨域访问的限制,以及据传输的序列化和反序列化等问题。在实际应用中,需要根据具体需求和场景合理使用Web Worker多线程功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值