如何实现 SharedArrayBuffer 和 Atomics 的并行?
How to achieve parallelism for SharedArrayBuffer and Atomics?
ECMA-2017(ES8),大约一个月前刚刚定稿,引入SharedArrayBuffer and Atomics. The link here表明它们已经在一些浏览器中得到支持。
正如我们所知,它们旨在允许跨线程共享数据。我想知道这种并行性在浏览器和 Node 中是如何实现的?我们应该分别使用 Web Workers 和 'cluster' 包吗?
确实,对于浏览器,SharedArrayBuffers
和 Atomics
旨在用于 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 包允许在不同线程和进程之间共享数据。
相关:
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
供数据查看使用!
ECMA-2017(ES8),大约一个月前刚刚定稿,引入SharedArrayBuffer and Atomics. The link here表明它们已经在一些浏览器中得到支持。
正如我们所知,它们旨在允许跨线程共享数据。我想知道这种并行性在浏览器和 Node 中是如何实现的?我们应该分别使用 Web Workers 和 'cluster' 包吗?
确实,对于浏览器,SharedArrayBuffers
和 Atomics
旨在用于 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 包允许在不同线程和进程之间共享数据。
相关:
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
供数据查看使用!