如何实现 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】:

确实,对于浏览器,SharedArrayBuffersAtomics 旨在使用 with WebWorkers,这是让代码在浏览器上下文中的并发线程中运行的自然方式。

对于 Node.js,集群包产生的线程确实可以共享数据,但在撰写本文时,Node.js 中还存在no implementation of SharedArrayBuffers,所以这是理论。你可能想浏览几个关于它的讨论:

Tracking issue: Worker support Does NodeJS have any plans for shared memory? High level architecture Why is it so hard to add threads to nodejs? or web workers?

已经有ems 包允许在不同线程和进程之间共享数据。

相关:

node-webworker-threads - Lightweight Web Worker API implementation with native threads

【讨论】:

Node 发布了一个新版本 (v10.5.0),包括可以共享 ArrayBufferSharedArrayBuffer 实例的实验性工作线程:nodejs.org/api/worker_threads.html

以上是关于如何实现 SharedArrayBuffer 和 Atomics 的并行性?的主要内容,如果未能解决你的问题,请参考以下文章

新的旁路攻击技术出现,Chrome 64 和 Firefox 57 将禁用 SharedArrayBuffer

发出跨源请求时出现 SharedArrayBuffer 错误

二十Javascript API(一)

如何在 ReactJS 项目中使用 ffmpeg.js

用babel和nodemon搭建一个功能齐全的nodejs开发环境

JavaScript基础知识总结 14:学习JavaScript中的File APIStreams APIWeb Cryptography API