【问题标题】:Is it possible to run WebAssembly code async?是否可以异步运行 WebAssembly 代码?
【发布时间】:2018-11-16 19:17:03
【问题描述】:

我编写了一个 C 函数,我可以使用 WebAssembly 从 Angular/TypeScript/JavaScript 执行该函数:

testWebAssembly() {
    Module.ccall("aCFunction", null, [], []); // takes a few seconds to finish
}

此函数执行一些繁重的数学计算,需要几秒钟才能完成。当用户点击按钮时触发:

<button (click)="testWebAssembly()">Launch C function</button>

是否可以执行该功能以使其不阻塞 Web 应用程序的 UI?

我试过setTimeOut/async/Promise,但我似乎无法让它工作。

谢谢!

【问题讨论】:

  • 你考虑过网络工作者吗?

标签: javascript c angular typescript webassembly


【解决方案1】:

WebAssembly 和 JavaScript 共享相同的执行线程,即当您从 JavaScript 中执行 WebAssembly 时,您的 JavaScript 代码会暂停,反之亦然。在这方面,它就像从您的 JavaScript 代码执行任何其他本机(即浏览器提供的)API。

您可以选择在 WebWorker 中运行 WebAssembly,使用 postMessage 将消息发送到在不同线程中执行的 wasm 代码。这里有一个很好的例子,它使用 WebWorkers 呈现分形:

https://www.reddit.com/r/rust/comments/8hdq5r/a_rust_javascript_web_workers_fractal_renderer/

未来 WebAssembly 可能会有自己的线程支持:

https://github.com/WebAssembly/threads

【讨论】:

  • 请注意,即使使用线程提案,您实际上也无法在 Wasm 本身中创建线程,而必须在 JS 端使用 worker 来创建。
  • 你知道解释 Angular/TypeScript 网络工作者的好资源吗?我不了解网络工作者,也没有使用过。
【解决方案2】:

单独的异步执行不会将其从主线程中移除。您实际上的意思是同时执行它。在 Web 上实现这一点的唯一方法是使用工作线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    相关资源
    最近更新 更多