如何实现 SharedArrayBuffer 和 Atomics 的并行?

How to achieve parallelism for SharedArrayBuffer and Atomics?

ECMA-2017(ES8),大约一个月前刚刚定稿,引入SharedArrayBuffer and Atomics. The link here表明它们已经在一些浏览器中得到支持。

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

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

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

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

相关:

nodejs官方支持SharedArrayBuffer和Array buffer!并且在文档中直接提到了它们 https://nodejs.org/api/worker_threads.html

Unlike child_process or cluster, worker_threads can share memory. They do so by transferring ArrayBuffer instances or sharing SharedArrayBuffer instances.

共享缓冲区和原子:

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

一篇直接解决共享缓冲区问题的好文章。以及 atomic 的使用(你也必须看看 Atomic)。

快速摘录(来自文章):


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

这篇文章涵盖了很多细节和原子的使用。检查最后一节关于浏览器的支持!它可能已经过时了!但仍然相关!

查看原子学介绍标题以获得很好的介绍! (这里太长了)。

来自 MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics。一个link要检查。

https://blog.logrocket.com/a-complete-guide-to-threads-in-node-js-4fa3898fe74f/

而这个占用了整个 multi-threading 包括共享缓冲区的使用。具有良好的历史背景。它可以处理很多事情。

也检查一下:

https://whosebug.com/a/51411795/7668448

供数据查看使用!