¿Es posible ejecutar el código WebAssembly asíncrono?

2 minutos de lectura

He escrito una función C que puedo ejecutar desde Angular/TypeScript/JavaScript usando WebAssembly:

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

Esta función realiza algunos cálculos matemáticos pesados ​​y necesita unos segundos para finalizar. Se activa cuando un usuario hace clic en un botón:

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

¿Es posible ejecutar la función para que no bloquee la interfaz de usuario de la aplicación web?

Lo intenté setTimeOut/async/Promisepero parece que no puedo hacerlo funcionar.

¡Gracias!

  • ¿Has considerado a los trabajadores web?

    – Jaromanda X

    7 de junio de 2018 a las 1:29

Avatar de usuario de ColinE
ColinE

WebAssembly y JavaScript comparten el mismo hilo de ejecución, es decir, cuando ejecuta WebAssembly desde JavaScript, su código JavaScript se detiene y viceversa. En ese sentido, es como ejecutar cualquier otra API nativa (es decir, proporcionada por el navegador) desde su código JavaScript.

Una opción que tiene es ejecutar su WebAssembly en un WebWorker, usando postMessage para enviar mensajes a su código wasm que se ejecutó en un hilo diferente. Hay un gran ejemplo aquí, que representa un fractal usando WebWorkers:

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

En el futuro, es probable que WebAssembly tenga su propio soporte para subprocesos:

https://github.com/WebAssembly/hilos

  • Tenga en cuenta que, incluso con la propuesta de subprocesos, en realidad no puede crear subprocesos en Wasm, sino que debe hacerlo con los trabajadores del lado de JS.

    – Andreas Rossberg

    7 junio 2018 a las 10:21


  • ¿Conoce una buena fuente que explique los trabajadores web para Angular/TypeScript? No sabía acerca de los trabajadores web y aún no los he usado.

    – andrés

    7 de junio de 2018 a las 10:24


La ejecución asíncrona por sí sola no lo quitará del hilo principal. Lo que realmente quieres decir es ejecutarlo simultáneamente. La única forma de lograrlo en la Web es mediante subprocesos de trabajo.

¿Ha sido útil esta solución?