【问题标题】:How to use WebAssembly (wasm) code in a Web Worker?如何在 Web Worker 中使用 WebAssembly (wasm) 代码?
【发布时间】:2018-04-15 11:42:38
【问题描述】:

目前,一个 Web Worker 是这样实例化的:

let worker = new Worker('worker.js');

然后浏览器获取worker.js,它可以开始响应消息。

我想使用 WebAssembly 实现我的工作人员的功能。理想情况下,我想做这样的事情:

let worker = new Worker('worker.wasm');

但我很确定这是不可能的。最明显的替代方法是让worker.js 获取worker.wasm 并编译并运行它。但这意味着我们获取一个脚本 (worker.js),它唯一的工作就是获取并运行另一个脚本 (worker.wasm)。这对我来说感觉很恶心。所以我的问题是:有没有更简洁的方式在 Web Worker 中使用 WebAssembly,不会引入额外的 fetch 步骤?

【问题讨论】:

  • “所以我的问题是:有没有更简洁的方式在 Web Worker 中使用 WebAssembly,不会引入额外的 fetch 步骤?” 使用的目的是什么如果不打算使用Worker,则首先是Worker? Question 中没有实际的问题陈述。

标签: javascript web-worker webassembly


【解决方案1】:

您可以将postMessageWebAssembly.Module 联系到Worker。因此,您将在主脚本中编译 foo.wasm,然后编译 postMessage 它,预计哪些实现会优化以避免重新编译或复制代码(尽管此时并非所有实现都这样做)。然后你只需要你的工人来实例化。

您需要实例化的一件事是importObject,并且您传入的内容需要驻留在该工人身上!因此,即使您可以说“使用此 .wasm 的新员工”,您也无法指定 importObject

这已记录在 in structured clone,这也会影响 IndexDB。

【讨论】:

  • 我不确定这是否真的有效。当我尝试在postMessage 中发送一个wasm Module 时,我得到了这个:example.js:54 Uncaught (in promise) DOMException: Failed to execute 'postMessage' on 'Worker': () => resolve(Module) could不被克隆。 localhost:8000/example.js:13702:31
  • 我清理了我的代码并使用WebAssembly.compile 来生成一个模块。然后我尝试通过postMessage 发送它,但我得到了这个:Uncaught (in promise) DOMException: Failed to execute 'postMessage' on 'Worker': An object could not be cloned.
  • 那是在 Chrome 60 下。Chrome 62 给出 Uncaught (in promise) DOMException: Failed to execute 'postMessage' on 'Worker': # 无法克隆。 Firefox 57.0b14 似乎可以工作。
  • 这听起来像一个 Chrome 错误。
  • github.com/nodeca/pica/blob/3.0.6/index.js#L322 wasm 对象传输在 chrome 中为我工作。但是我在下一个版本的包中放弃了这个。 Browserify + webworkify 足够好(它从主线程中的模块动态创建 ww src)。恕我直言,ww 中针对小模块的额外编译步骤既便宜又可取,以保持简单。
猜你喜欢
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多