Ist es möglich, WebAssembly-Code asynchron auszuführen?

Lesezeit: 2 Minuten

Ich habe eine C-Funktion geschrieben, die ich mit WebAssembly von Angular/TypeScript/JavaScript ausführen kann:

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

Diese Funktion führt einige schwere mathematische Berechnungen durch und benötigt einige Sekunden, um abgeschlossen zu werden. Es wird ausgelöst, wenn ein Benutzer auf eine Schaltfläche klickt:

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

Ist es möglich, die Funktion so auszuführen, dass sie die Benutzeroberfläche der Webanwendung nicht blockiert?

Ich habe es versucht setTimeOut/async/Promiseaber ich scheine nicht in der Lage zu sein, es zum Laufen zu bringen.

Danke schön!

  • hast du schon mal an webworker gedacht?

    – Jaromanda X

    7. Juni 2018 um 1:29 Uhr

Benutzeravatar von ColinE
ColinE

WebAssembly und JavaScript verwenden denselben Ausführungs-Thread, dh wenn Sie WebAssembly in JavaScript ausführen, wird Ihr JavaScript-Code angehalten und umgekehrt. In dieser Hinsicht ist es genau wie bei der Ausführung anderer nativer (dh vom Browser bereitgestellter) APIs aus Ihrem JavaScript-Code.

Eine Option, die Sie haben, besteht darin, Ihre WebAssembly in einem WebWorker auszuführen, indem Sie verwenden postMessage um Nachrichten an Ihren Wasm-Code zu senden, der in einem anderen Thread ausgeführt wurde. Hier ist ein großartiges Beispiel, das ein Fraktal mit WebWorkers rendert:

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

In Zukunft wird WebAssembly wahrscheinlich eine eigene Unterstützung für Threading haben:

https://github.com/WebAssembly/threads

  • Beachten Sie, dass Sie selbst mit dem Thread-Vorschlag keine Threads in Wasm selbst erstellen können, sondern dies mit Workern auf der JS-Seite tun müssen.

    – Andreas Roßberg

    7. Juni 2018 um 10:21 Uhr


  • Kennen Sie eine gute Quelle, die Webworker für Angular/TypeScript erklärt? Ich kannte Webworker nicht und habe sie noch nicht verwendet.

    – Andreas

    7. Juni 2018 um 10:24 Uhr


Die asynchrone Ausführung allein wird es nicht vom Hauptthread entfernen. Was Sie eigentlich meinen, ist die gleichzeitige Ausführung. Die einzige Möglichkeit, dies im Web zu erreichen, ist die Verwendung von Worker-Threads.

1437250cookie-checkIst es möglich, WebAssembly-Code asynchron auszuführen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy