如何实现 SharedArrayBuffer 和 Atomics 的并行性?
Posted
技术标签:
【中文标题】如何实现 SharedArrayBuffer 和 Atomics 的并行性?【英文标题】:How to achieve parallelism for SharedArrayBuffer and Atomics? 【发布时间】:2017-12-27 01:45:11 【问题描述】:ECMA-2017(ES8),大约一个月前刚刚完成,引入了SharedArrayBuffer 和Atomics。 link here 表示它们已在某些浏览器中得到支持。
众所周知,它们旨在允许跨线程共享数据。我想知道这种并行性是如何在浏览器和 Node 中实现的?我们应该分别使用 Web Workers 和 'cluster' 包吗?
【问题讨论】:
Node是单线程应用,不是吗? 好吧,我认为线程可以被分叉并使用“集群”包在不同的核心上并行运行。 【参考方案1】:对于 nodejs 官方支持 SharedArrayBuffer 和 Array buffer!并且在文档中直接提到了它们 https://nodejs.org/api/worker_threads.html
与 child_process 或 cluster 不同,worker_threads 可以共享内存。他们 通过传输 ArrayBuffer 实例或共享来实现 SharedArrayBuffer 个实例。
共享缓冲区和原子:
https://www.sitepen.com/blog/the-return-of-sharedarraybuffers-and-atomics/
一篇直接解决共享缓冲区的好文章。以及与 atomic 的使用(您也必须查看 Atomic)。
快速 sn-p(来自文章):
// Creating a shared buffer
const length = 10;
// Get the size we want in bytes for the buffer
const size = Int32Array.BYTES_PER_ELEMENT * length;
// Create a buffer for 10 integers
const sharedBuffer = new SharedArrayBuffer(size);
const sharedArray = new Int32Array(sharedBuffer);
现在我们有一个共享缓冲区,我们可以将其传递给工作人员上下文,并且还有一个整数数组可以利用该共享缓冲区。将此缓冲区引用传递给工作人员:
// main.js
worker.postMessage(sharedBuffer);
这个缓冲区允许我们在工作端创建另一个共享数组:
// worker.js
constsharedArray = new Int32Array(m.data);
这篇文章涵盖了很多细节以及 atomic 的使用。检查最后一节关于浏览器的支持!它可能已经过时了!但仍然相关!
查看介绍原子标题以获得很好的介绍! (这里太长了)。
来自 MDN https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Atomics。要检查的链接。
和
https://blog.logrocket.com/a-complete-guide-to-threads-in-node-js-4fa3898fe74f/
而这个采用了整个多线程,包括共享缓冲区的使用。具有良好的历史背景。它可以处理很多事情。
也检查一下:
https://***.com/a/51411795/7668448
供数据视图使用!
【讨论】:
【参考方案2】:确实,对于浏览器,SharedArrayBuffers
和 Atomics
旨在使用 with WebWorkers,这是让代码在浏览器上下文中的并发线程中运行的自然方式。
对于 Node.js,集群包产生的线程确实可以共享数据,但在撰写本文时,Node.js 中还存在no implementation of SharedArrayBuffers
,所以这是理论。你可能想浏览几个关于它的讨论:
已经有ems 包允许在不同线程和进程之间共享数据。
相关:
node-webworker-threads - Lightweight Web Worker API implementation with native threads【讨论】:
Node 发布了一个新版本 (v10.5.0),包括可以共享ArrayBuffer
或 SharedArrayBuffer
实例的实验性工作线程:nodejs.org/api/worker_threads.html以上是关于如何实现 SharedArrayBuffer 和 Atomics 的并行性?的主要内容,如果未能解决你的问题,请参考以下文章
新的旁路攻击技术出现,Chrome 64 和 Firefox 57 将禁用 SharedArrayBuffer
发出跨源请求时出现 SharedArrayBuffer 错误
用babel和nodemon搭建一个功能齐全的nodejs开发环境
JavaScript基础知识总结 14:学习JavaScript中的File APIStreams APIWeb Cryptography API