详解Web中多线程的方法Web Workers(一)- 初探

59 阅读3分钟

前言

多线程是现代软件开发中用于增强应用程序性能和响应能力的重要技术。然而,由于JavaScript的单线程特性。为了克服这一限制,引入了Web Workers作为在Web应用程序中启用此技术的一种方式。在本文中,我们将探讨了Web Workers的重要性,包括使用它的限制和注意事项,以及减轻与Web Workers相关的潜在问题的策略。

Web Workers是现代Web开发的强大功能,并于2009年作为HTML5规范的一部分引入。它们旨在提供一种在后台执行JavaScript代码的方法,与网页的主执行线程分开,以提高性能和响应能力。

主线程是负责呈现UI、执行JavaScript代码和处理用户交互。换句话说,JavaScript单线程的。这意味着任何耗时的任务,例如执行的复杂计算或数据处理,都将阻塞主线程并导致UI渲染和页面无响应。

Web Workers是为了解决这个问题,它允许在一个单独的线程(称为工作线程)中执行耗时的任务。这使得JavaScript代码可以在后台执行,而不会阻塞主线程,以至于页面没有响应。

JavaScript中创建Web Worker并不是一项复杂的任务。

以下步骤开始将Web Worker集成到应用程序中:

  1. 创建一个新的JavaScript文件,其中包含要在辅助线程中运行的代码。此文件不应包含任何对DOM的引用,因为它将无法访问DOM。

  2. 在主JavaScript文件中,使用 Worker 构造函数创建一个新的worker对象。此构造函数接受一个参数,即您在步骤1中创建的JavaScript文件的URL。

    const worker = new Worker('worker.js');
    
  3. 向辅助对象添加事件侦听器,以处理在主线程和辅助线程之间发送的消息。 onmessage 事件处理器用于处理从工作线程发送的消息,而 postMessage 方法用于向工作线程发送消息。

    worker.onmessage = function(event) {
      console.log('Worker said: ' + event.data);
    };
    worker.postMessage('Hello, worker!');
    
  4. 在worker 的 JavaScript文件中,添加一个事件侦听器,以使用 self 对象的 onmessage 属性处理从主线程发送的消息。您可以使用 event.data 属性访问随消息发送的数据。

    self.onmessage = function(event) {
      console.log('Main thread said: ' + event.data);
      self.postMessage('Hello, main thread!');
    };
    

现在让我们运行。我们应该看到打印到控制台的消息,表明在主线程和辅助线程之间发送和接收了消息。

Messages in the console between the main thread and the worker thread

Web Workers和主线程之间的一个关键区别Web Workers不能访问DOM或UI。这意味着它们不能直接操作页面上的HTML元素或与用户交互。

另一个重要的区别是Web Workers被设计为在沙箱环境中运行,与主线程分开,这意味着它们对系统资源的访问有限,并且不能访问某些API,例如 localStorage 或 sessionStorage API。

但是,它们可以通过消息传递系统与主线程通信,从而允许在两个线程之间交换数据。

未完待续