admin管理员组

文章数量:1402433

Currently, a Web Worker is instantiated thus:

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

The browser then fetches worker.js and it can start responding to messages.

I'd like to implement my worker's functionality using WebAssembly. Ideally, I'd like to do something like this:

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

But I'm pretty sure that's not possible. The most obvious alternative is to have worker.js fetch worker.wasm and pile and run it. But this means we fetch one script (worker.js) whose only job is to fetch and run another script (worker.wasm). This feels gross to me. And so my question: is there a cleaner way of using WebAssembly within a Web Worker, which won't introduce an extra fetch step?

Currently, a Web Worker is instantiated thus:

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

The browser then fetches worker.js and it can start responding to messages.

I'd like to implement my worker's functionality using WebAssembly. Ideally, I'd like to do something like this:

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

But I'm pretty sure that's not possible. The most obvious alternative is to have worker.js fetch worker.wasm and pile and run it. But this means we fetch one script (worker.js) whose only job is to fetch and run another script (worker.wasm). This feels gross to me. And so my question: is there a cleaner way of using WebAssembly within a Web Worker, which won't introduce an extra fetch step?

Share Improve this question asked Nov 2, 2017 at 20:17 Josh HansenJosh Hansen 1,4782 gold badges17 silver badges21 bronze badges 4
  • "And so my question: is there a cleaner way of using WebAssembly within a Web Worker, which won't introduce an extra fetch step?" What is purpose of using Worker in the first instance if Worker is not intended to be used? No actual problem statement exists at Question. – guest271314 Commented Nov 2, 2017 at 20:31
  • @guest271314 one benefit is that wasm would be run in a different thread – nalply Commented Nov 27, 2022 at 15:02
  • Probably you could put the wasm in a SharedArrayBuffer, didn't try it out but I could imagine that with a SharedArrayBuffer no copying is needed. – nalply Commented Nov 27, 2022 at 15:03
  • This repository contains a couple of examples for using web workers with Wasm (piled from Rust): github./sgasse/wasm_worker_interaction – Matthias Braun Commented Jan 21, 2023 at 20:28
Add a ment  | 

1 Answer 1

Reset to default 2

You can postMessage a WebAssembly.Module to a Worker. You'd therefore pile foo.wasm in your main script, and then postMessage it, which implementations are expected to optimize so as not to repile or duplicate code (though at this time not all implementations do so). You then merely need your worker to instantiate.

One thing you need for instantiate is an importObject, and what you pass in needs to be resident to that worker! So even if you could say "new worker with this .wasm" you wouldn't have a way to specify the importObject.

This is documented in structured clone, which also affects IndexDB.

本文标签: javascriptHow to use WebAssembly (wasm) code in a Web WorkerStack Overflow