gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:45:48 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com