ECMAScript 2017 中的共享内存模型:SharedArrayBuffer 的应用场景

JavaScript 是一门单线程语言,这使得展示繁重的处理任务变得特别困难。SharedArrayBuffer 是 ECMAScript 2017 中新的功能,它允许浏览器使用多个线程或 Web Workers。换句话说,这个功能提供了可共享的内存机制,以便在不同的线程之间传递信息。在本文中,我们将了解 SharedArrayBuffer 的工作原理以及如何在应用程序中使用它的应用场景。

什么是 SharedArrayBuffer?

SharedArrayBuffers 是一个固定大小的内存缓冲区,可以在多个线程之间共享,这些线程可以同时访问共享内存缓冲区。不像主线程,并发线程通常运行在单独的进程中,SharedArrayBuffer 没有复制、创建或销毁带来的内存增长,这使得共享内存更加被批准。

创建 SharedArrayBuffer

创建 SharedArrayBuffer 实例非常简单,可以使用以下代码:

--- ------ - --- ------------------------

其中 size 参数代表内存缓冲区的大小(以字节为单位)。在创建后,可以在不同的线程之间使用这些缓冲区。

访问 SharedArrayBuffer

SharedArrayBuffer 可以通过一组新的 API 简单地访问。以下是最常用的两种方法:

--- ----- - --- ------------------
--- ---- - --- -----------------
  • Int8Array 会创建一个指向 SharedArrayBuffer 的“视图”。Int8Array 的值的范围从-128 到 127,而另一方面,UInt8Array(无符号 8 位整数)的范围从 0 到 255。

  • DataView 对象提供了一个与它相关的 SharedArrayBuffer 的灵活而复杂的视图,它允许注入、检查和操作固定大小的缓冲区。DataView 实例允许使用 getUint8、getInt16 和 setInt32 等方法将数据类型转换为其他数据类型。

这样就可以随意访问在共享内存中创建的数组或缓冲区。

SharedArrayBuffer 应用场景

由于 SharedArrayBuffer 允许不同的线程之间共享内存,请考虑以下场景:

1. 数据处理

JavaScript 不常常用作数学或图像处理等任务。使用 SharedArrayBuffer,可以轻松将重要工作分配到多个单独的线程中。

以下是一个使用 SharedArrayBuffer 并发计算的示例:

----- ------ - --- -------------------- - ------------------------------
----- --------- - --- -------------------

--- ------- - ---

--- ---- - - -- - - -- ---- -
  ---------------- -----------------------
-

------------------------ -- -
  -------------------- ------- ------ ---
  ---------------- - ------- -- -
    ------------------------
  --
---

在上面的示例中,共享内存缓冲区被实例化,Worker 对象被推入数组中,然后每个 Worker 对象都被初始化。然后,for 循环将每个 Worker 对象的位置更新为 URL,并设置传递的 SharedArrayBuffer 对象。每个 Worker 对象都有一个指向相应 SharedArrayBuffer 的视图,并执行工作。最后,每个线程都用 onmessage 监听加载事件,并进行相应的操作。这样,每个线程都可以共享相同的内存缓冲区。

2. 网络通讯

SharedArrayBuffer 可以显着提高跨越网络的数据传输性能,以及其他任何可以通过 JavaScript 处理的类似场景。以下是 SharedArrayBuffer 在 WebSockets 中使用的示例:

----- ------ - --- ----------------------
----- ---- - --- -----------------
---------------- -----

--- -- - --- ---------------------------------
--------- - -------- -- -
  ----------------
--

在这里,先创建 SharedArrayBuffer 实例,并设置 view 视图,写入数据。然后,WebSocket 对象被实例化,并使用 .send() 将数据发送到服务器。

未来发展

SharedArrayBuffer 并不是适用于所有 Web 平台的技术,并且由于安全问题,它已被关闭。然而,这个技术将在未来版本的中引入安全介绍。在将来,可以期望由 ServiceWorker API 驱动的主进程(或脚本)中,可以定期刷新或关闭这些并发 Workers 线程或后台运行模块。

结论

SharedArrayBuffer 将在并发编程和内存开销方面,提供一种有效的解决方案。它在处理数据、计算和网络请求方面都有着很强的应用潜力。下一次当你运行重计算程序而程序卡住了,这时你就应该考虑用 SharedArrayBuffer 来进行开发了。

参考资料

JavaScript 中的 SharedArrayBuffer

MDN Web 文档

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6711edb4ad1e889fe20197c5