javascript - 为什么在 JavaScript 中传输的缓冲区会被中和?

标签 javascript web-worker

Javascript 允许将缓冲区从源线程传输到工作线程。否则,ArrayBuffer 会被复制,然后传递给工作线程。传输的缓冲区在源线程中不可访问(“绝育”)[1]:

// create data that can be transfered
var arr = new Uint8Array(5);

// outputs: 5
console.log(arr.buffer.byteLength);

var worker = new Worker("some_worker.js");

// transfer the buffer
worker.postMessage({arr: arr}, [arr.buff]);

// the buffer vanishes. is "Neutered"
// outputs: 0
console.log(arr.buffer.byteLength);

我了解这个机制是如何运作的。不过我很好奇为什么要引入它。为什么工作线程之间不共享数据,就像在传统的线程模型中一样,允许多个线程访问相同的数据 内存区域?

<小时/>

同一问题的其他措辞以供澄清:

为什么缓冲液在转移时要进行中性处理?/这个机制背后的原因是什么?/为什么要引入它?为什么Workers之间不能共享内存区域?

我正在寻找来自可靠和/或官方来源的答案。

<小时/>

[1] https://developer.mozilla.org/en/docs/Web/API/Worker/postMessage

最佳答案

Web Workers 中引入了可传输对象,以提高复制对象的性能(特别是当我们谈论大尺寸对象时)。它可以并行化为常见编程语言(例如 C/C++)中按值传递和按引用传递之间的比较。

可能添加了进一步的限制,即可传输对象不能在源工作线程中使用,以便保证两个不同线程之间不会出现竞争条件(以方便开发人员的工作)不必关心这一点)。此外,还需要在 Javascript 中实现更多的并发原语(例如互斥体等)。本质上,使用“传输”意味着您只是打算将数据传输到另一个线程,而不是同时从 2 个线程使用它们,因此我们可以说这种实现是有意义的。

一般来说,Web Workers 并不是设计为共享内存模型,而是设计为消息交换模型。

要进一步了解性能差异,请查看 this 。您还可以查看this ,其中讨论了为什么 WebKit 中的 Web Workers 没有采用共享内存模型。

关于javascript - 为什么在 JavaScript 中传输的缓冲区会被中和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38169672/

相关文章:

javascript - 尝试从货币字符串中删除美元符号以将字符串转换为整数

Javascript WebWorker - 异步/等待

javascript - Web worker 和访问对象附加到 window 对象

karma-runner - 尝试使用 Web Worker 时 Karma 出现 404

javascript - 在 Web Worker 仍在运行时向其发送消息

javascript - 更改 div 中的文本

javascript - 动态更改语言时,是否应该更新 HTML lang 属性?

javascript - 在 node.js 中扩展类的不同方式

javascript - jQuery 库文件中的 "Illegal character",即使在任何地方都没有不可见字符或缺少引号

ember.js - Ember 并发与 Web Worker