Design: Wasmrutinas

Creado en 30 dic. 2019  ·  5Comentarios  ·  Fuente: WebAssembly/design

La propuesta de subprocesos de WebAssembly existente se centra en permitir que el programa compilado wasm utilice múltiples subprocesos del sistema. Esta es una característica extremadamente útil para tareas que requieren un uso intensivo de la CPU. Pero hay una gran clase de problemas que son intensivos en IO y se resuelven mejor con corrutinas mucho más ligeras que los subprocesos del sistema. La reciente incorporación de Rust async-wait a un lenguaje que ya admite subprocesos múltiples es un buen ejemplo de tal necesidad. El problema con async-await es que requiere una forma completamente diferente de escribir el código de la aplicación, así como diferentes técnicas de compilación. Por otro lado, una de las principales razones de la popularidad de Go son las gorutinas que parecen hilos reales para el desarrollador mientras se ejecutan como corrutinas por el tiempo de ejecución.
Creo que WebAssembly está en una posición única para llevar la ventaja del modelo de subprocesos Go a prácticamente cualquier aplicación multiproceso que se pueda compilar en wasm. La idea es que el programa compilado no necesita cambiar para aprovechar los hilos verdes, esto se convierte en la elección del host sobre cómo ejecutarlo.
Otra característica importante de WebAssembly es la ejecución determinista. Con subprocesos verdes, debería ser sencillo implementar el modo de ejecución determinista para objetivos multiproceso.
El nombre del hombre de paja para la función es _Wasmroutines_.

Encontré algunos problemas relacionados con "hilos nativos de wasm" como https://github.com/WebAssembly/design/issues/126 y https://github.com/WebAssembly/design/issues/1252 pero parece que son considerado como algo que el wasm podría conseguir eventualmente, pero bastante teórico en este punto.

Creo que la _implementación del hilo del sistema único_ se puede hacer con un esfuerzo relativamente pequeño (por ejemplo, podría usar la memoria lineal normal) y proporcionaría mucho valor (como ejecutar cualquier programa multiproceso sin modificación) que vale la pena tener como un diseño separado propuesta.

Comentario más útil

Hay un video donde @rossberg presenta el diseño propuesto para continuaciones (mencionado por @lukewagner).

https://youtu.be/pq-Pa2Fj4nE?t=3231

Todos 5 comentarios

Puede que le interese Asyncify , que es una herramienta de transformación de código que se puede utilizar para pausar y reanudar la ejecución o cambiar pilas en WebAssembly sin necesidad de nuevas funciones de WebAssembly. Esta solución tiene gastos generales, y creo que hay planes para proponer un nuevo mecanismo para el cambio de pila utilizando controladores de efectos algebraicos, que son esencialmente solo excepciones reanudables. La propuesta de excepciones se ha diseñado teniendo en cuenta esta dirección futura.

Gracias @tlively. Asyncify parece una buena solución provisional para mi problema. Intentaré hacer un prototipo encima. Idealmente, me gustaría ejecutar cualquier programa WebAssembly multiproceso sin ninguna modificación utilizando solo las funciones que proporciona el host.

@mfateev Creo que tienes razón; Sería de gran valor apoyar las corrutinas. Ya ha habido algunas discusiones preliminares sobre la unificación del manejo de excepciones y las corrutinas en el marco de los efectos algebraicos. Esto se discute en la antigua propuesta de manejo de excepciones, y creo que @rossberg tiene un pensamiento de diseño más nuevo compatible con la nueva propuesta de manejo de excepciones.

Hay un video donde @rossberg presenta el diseño propuesto para continuaciones (mencionado por @lukewagner).

https://youtu.be/pq-Pa2Fj4nE?t=3231

Gracias por el video. El "cambio de pila" es una abstracción muy poderosa que permitiría una gran cantidad de casos de uso. Espero que sea compatible.

Mi ángulo es de alguna manera diferente al no proponer nuevas características en el código de bytes wasm. Estoy buscando proporcionar la ejecución determinista para cualquier código multiproceso que use atomic.wait / notificar y otras operaciones atómicas. Creo que podemos especificar un modo de ejecución de host especial que se basa esencialmente en una rutina, pero que parece un tiempo de ejecución de múltiples subprocesos para una aplicación de ensamblaje web.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

spidoche picture spidoche  ·  4Comentarios

JimmyVV picture JimmyVV  ·  4Comentarios

jfbastien picture jfbastien  ·  6Comentarios

bobOnGitHub picture bobOnGitHub  ·  6Comentarios

konsoletyper picture konsoletyper  ·  6Comentarios