SharedArrayBuffer和Atomics如何实现并行?

问题描述 投票:0回答:2
大约一个月前刚刚完成的

ECMA-2017(ES8)引入了SharedArrayBufferAtomics此处的链接显示某些浏览器已支持它们。

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

javascript multithreading parallel-processing shared-memory ecmascript-2017
2个回答
4
投票

事实上,对于浏览器来说,

SharedArrayBuffers
Atomics
旨在与WebWorkers一起使用,这是在浏览器上下文中的并发线程中运行代码的自然方式。

对于 Node.js,使用 cluster 包生成的线程确实是共享数据的候选者,但在撰写本文时,Node.js 中还没有

SharedArrayBuffers

 的实现,所以这是理论上的。您可能想浏览一些有关它的讨论:

    跟踪问题:工人支持
  • NodeJS 有共享内存的计划吗?
  • 高层架构
  • 为什么nodejs添加线程这么难?还是网络工作者?
  • 已经有了
ems

包,它允许在不同线程和进程之间共享数据。 相关:

    node-webworker-threads - 使用本机线程的轻量级 Web Worker API 实现

1
投票
https://nodejs.org/api/worker_threads.html

: 的文档中直接提到了它们

与child_process或cluster不同,worker_threads可以共享内存。他们 通过传输
ArrayBuffer

实例或共享来实现 SharedArrayBuffer 实例。

共享缓冲区和原子:

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

。一个检查链接。

还有

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

这个需要整个多线程,包括共享缓冲区的使用。具有良好的历史背景。它解决了很多很多事情。

也检查一下:

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

用于数据视图的使用!

© www.soinside.com 2019 - 2024. All rights reserved.