ECMA-2017(ES8),大约在一个月前完成,介绍了SharedArrayBuffer和Atomics。 link here表示某些浏览器支持它们。
正如我们所知,它们旨在允许跨线程共享数据。我想知道在浏览器和Node中如何实现这种并行性?我们是否应该分别使用Web Workers和'cluster'包?
答案 0 :(得分:4)
确实,对于浏览器SharedArrayBuffers
和Atomics
,我们打算使用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
用于数据视图!