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/