【问题标题】:SharedArrayBuffer and SharedWorkerSharedArrayBuffer 和 SharedWorker
【发布时间】:2017-11-28 09:56:04
【问题描述】:

在 ECMAScript 2017 的功能中有Shared memory and atomics。 我尝试在 Google Chrome 59.0.3071.109 中对其进行测试(启用了实验性 SharedArrayBuffer 标志)。 当我尝试在简单的 Worker 中发布 SharedArrayBuffer 时,它是有效的。但是当我尝试在 SharedWorker 中发布 SharedArrayBuffer 时,在 onmessage 事件处理程序的事件参数中我得到 event.data 为空。为什么会这样?这是我的代码示例:

index.html:

<!doctype html>

<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Web Workers</title>
    <script src="main.js"></script>
</head>

<body>

<button onclick="post()">Post</button>
<button onclick="get()">Get</button>

</body>
</html>

main.js:

var worker = new SharedWorker('worker.js');
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
new Int32Array(buffer)[0] = 12;

function post() {
    worker.port.postMessage({buffer});
}

function get() {
    console.log(new Int32Array(buffer)[0]);
}

worker.js:

self.onconnect = function (e) {
    var [port] = e.ports;

    port.onmessage = function (e) {
        console.log(e.data);// null
    };
};

谢谢。

【问题讨论】:

  • 不确定如何获得该结果,但据我所知,Chrome 59 尚不支持 SharedArrayBuffer
  • 有 chrome://flags/#shared-array-buffer。我会重复一遍,一切都与简单的工人一起工作。
  • kangax.github.io/compat-table/es2016plus 这里也标明了。 [17] 该功能必须通过“在 JavaScript 中实验性启用 SharedArrayBuffer 支持”来启用。在 about:flags 下设置
  • 所以这个功能仍然落后于标志是有原因的。它还不稳定。在这种情况下,我认为 Chrome 上的当前实现存在错误。
  • 好的。也许。问一个问题时,我试图理解这个错误或功能。谢谢你的版本。

标签: javascript web web-worker ecmascript-2017


【解决方案1】:

根据 Chromium Blink Workers 文档:Shared Worker 处于进程外。

它运行在与文档进程不同的另一个系统进程上(包含 JS 主线程)。

操作系统进程拒绝其他进程的内存访问。

SharedArraybuffer 通过共享(访问)内存工作。所以SharedArraybuffer由JS主线程(文档进程)创建(访问)不能被Shared Worker(进程外)访问。

【讨论】:

    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    相关资源
    最近更新 更多