JavaScript 是一门单线程语言,这使得展示繁重的处理任务变得特别困难。SharedArrayBuffer 是 ECMAScript 2017 中新的功能,它允许浏览器使用多个线程或 Web Workers。换句话说,这个功能提供了可共享的内存机制,以便在不同的线程之间传递信息。在本文中,我们将了解 SharedArrayBuffer 的工作原理以及如何在应用程序中使用它的应用场景。
什么是 SharedArrayBuffer?
SharedArrayBuffers 是一个固定大小的内存缓冲区,可以在多个线程之间共享,这些线程可以同时访问共享内存缓冲区。不像主线程,并发线程通常运行在单独的进程中,SharedArrayBuffer 没有复制、创建或销毁带来的内存增长,这使得共享内存更加被批准。
创建 SharedArrayBuffer
创建 SharedArrayBuffer 实例非常简单,可以使用以下代码:
let buffer = new SharedArrayBuffer(size);
其中 size
参数代表内存缓冲区的大小(以字节为单位)。在创建后,可以在不同的线程之间使用这些缓冲区。
访问 SharedArrayBuffer
SharedArrayBuffer 可以通过一组新的 API 简单地访问。以下是最常用的两种方法:
let array = new Int8Array(buffer); let view = new DataView(buffer);
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 中使用的示例:
const buffer = new SharedArrayBuffer(32); const view = new DataView(buffer); view.setInt32(0, 200); let ws = new WebSocket("ws://localhost:8000"); ws.onopen = function () { ws.send(buffer); };
在这里,先创建 SharedArrayBuffer 实例,并设置 view 视图,写入数据。然后,WebSocket 对象被实例化,并使用 .send()
将数据发送到服务器。
未来发展
SharedArrayBuffer 并不是适用于所有 Web 平台的技术,并且由于安全问题,它已被关闭。然而,这个技术将在未来版本的中引入安全介绍。在将来,可以期望由 ServiceWorker API 驱动的主进程(或脚本)中,可以定期刷新或关闭这些并发 Workers 线程或后台运行模块。
结论
SharedArrayBuffer 将在并发编程和内存开销方面,提供一种有效的解决方案。它在处理数据、计算和网络请求方面都有着很强的应用潜力。下一次当你运行重计算程序而程序卡住了,这时你就应该考虑用 SharedArrayBuffer 来进行开发了。
参考资料
JavaScript 中的 SharedArrayBuffer
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6711edb4ad1e889fe20197c5