如何实现SharedArrayBuffer和Atomics的并行性?

时间:2017-07-21 06:17:48

标签: javascript multithreading parallel-processing shared-memory ecmascript-2017

ECMA-2017(ES8),大约在一个月前完成,介绍了SharedArrayBufferAtomicslink here表示某些浏览器支持它们。

正如我们所知,它们旨在允许跨线程共享数据。我想知道在浏览器和Node中如何实现这种并行性?我们是否应该分别使用Web Workers和'cluster'包?

2 个答案:

答案 0 :(得分:4)

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

对于Node.js,使用集群包生成的线程确实是共享数据的候选者,但在撰写本文时,Node.js中还有no implementation of SharedArrayBuffers,所以这就是理论。您可能想要扫描几个关于它的讨论:

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

相关:

答案 1 :(得分:1)

对于nodejs,SharedArrayBuffer和Array缓冲区已正式受支持!它们直接在文档中提到 https://nodejs.org/api/worker_threads.html

  

与child_process或集群不同,worker_threads可以共享内存。他们   通过传输 ArrayBuffer 实例或共享来实现    SharedArrayBuffer 实例。

共享缓冲区和原子:

https://www.sitepen.com/blog/the-return-of-sharedarraybuffers-and-atomics/

一篇很好的文章,直接解决了共享缓冲区。以及原子的使用(您也必须查看原子)。

快速摘要(摘自文章):


// 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);

本文还涵盖了许多细节以及原子的用法。还要检查最后一部分有关浏览器支持的内容!它可能已经过时了!但仍然有意义!

查看 Introducing Atomics 标题以获得良好的介绍! (太久了,无法在此处放置)。

并来自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://stackoverflow.com/a/51411795/7668448

用于数据视图!