📜  Javascript 中的网络工作者(1)

📅  最后修改于: 2023-12-03 15:01:40.647000             🧑  作者: Mango

Javascript 中的网络工作者

Web Worker 是 JavaScript 的一个 API,可以在浏览器后台运行脚本而不会冻结用户界面。在两者之间创建一个新线程,此新线程可以访问主线程中的 JavaScript 上下文,并且两者都可以执行JavaScript代码。这项功能允许后台运行密集计算任务,无需担心它们会使用户界面变得缓慢或停止响应,从而增加了浏览器的响应性。

Web Worker 的类型

Web Worker 有两种子类型:专用工作者和共享工作者。

专用工作者

专用工作者(Dedicated Workers)是拥有自己的上下文的 worker。只有创建它们的JavaScript可以访问这些上下文。可以使用它们标记为以下类型:

const worker = new Worker('worker.js');
共享工作者

共享工作者(Shared Workers)则是为多个Web Workers保留的Worker。这意味着如果有多个标签页使用同一worker,则它们都将共享一个worker,这个共享worker可以被写成一下格式:

const worker = new SharedWorker('worker.js');
worker.port.addEventListener('message', handleMessage);
Web Worker 的使用

Web Worker 可以通过 JavaScript 文件创建。例如,如果要在后台执行一些计算工作,则可以创建以下 JavaScript 文件

// worker.js
self.addEventListener('message', function(e) {
  const result = someComputationalyIntensiveFunction(e.data);
  self.postMessage(result);
}, false);

创建 Web Worker 的方式如下

const worker = new Worker('worker.js');
worker.postMessage(someData);
worker.addEventListener('message', function(e) {
  const result = e.data;
  console.log('Worker returned:', result);
}, false);

在这里,我们将数据发送给 worker,然后使用 addEventListener 监听 worker 返回的结果。值得注意的是,从 worker 发送的数据将无法传递任何函数,因为它不在主线程中执行(不同线程中的JavaScript上下文不能共享函数)。通过这种方式的限制,这非常适合处理可以序列化的简单数据。同时,worker 中又可以通过 self.importScripts() 加载到其他工具库。

结论

Web Workers 允许JavaScript中的大量计算在后台线程中运行。这对于需要处理许多计算密集型任务的 Web 应用程序非常有用,而不会冻结浏览器 UI。共享和专用工作者之间的选择可以根据您的需求进行调整,但值得注意的是,shared worker 也是共享状态的。

如果您的应用程序需要处理大量数据或需要使用大量 CPU 计算,则思考在主线程之外使用Web Worker来优化性能。