ECMA-2017(ES8)引入了SharedArrayBuffer和Atomics。 此处的链接显示某些浏览器已支持它们。
众所周知,它们旨在允许跨线程共享数据。我想知道这种并行性在浏览器和Node中是如何实现的?我们应该分别使用 Web Workers 和“集群”包吗?
事实上,对于浏览器来说,
SharedArrayBuffers
和Atomics
旨在与WebWorkers一起使用,这是在浏览器上下文中的并发线程中运行代码的自然方式。
对于 Node.js,使用 cluster 包生成的线程确实是共享数据的候选者,但在撰写本文时,Node.js 中还没有 的实现,所以这是理论上的。您可能想浏览一些有关它的讨论:ems
ArrayBufferhttps://www.sitepen.com/blog/the-return-of-sharedarraybuffers-and-atomics/实例或共享来实现 SharedArrayBuffer 实例。
共享缓冲区和原子:
一篇直接讨论共享缓冲区的好文章。以及与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还有https://blog.logrocket.com/a-complete-guide-to-threads-in-node-js-4fa3898fe74f/
这个需要整个多线程,包括共享缓冲区的使用。具有良好的历史背景。它解决了很多很多事情。
也检查一下:https://stackoverflow.com/a/51411795/7668448