Design: Wasmroutines

Criado em 30 dez. 2019  ·  5Comentários  ·  Fonte: WebAssembly/design

A proposta de threads de WebAssembly existente se concentra em permitir que o programa compilado wasm utilize vários threads de sistema. Este é um recurso extremamente útil para tarefas intensivas da CPU. Porém, há uma grande classe de problemas que exige muito IO e é mais bem resolvida por corrotinas muito mais leves do que as roscas do sistema. A recente adição do Rust async-wait a uma linguagem que já oferece suporte a multithreading é um bom exemplo dessa necessidade. O problema com async-await é que ele requer uma maneira completamente diferente de escrever o código do aplicativo, bem como diferentes técnicas de compilação. Por outro lado, uma das principais razões para a popularidade do Go são as goroutines, que parecem threads reais para o desenvolvedor, enquanto são executadas como co-rotinas pelo tempo de execução.
Eu acredito que o WebAssembly está posicionado de forma única para trazer a vantagem do modelo de threading Go para praticamente qualquer aplicativo multithread que possa ser compilado para o wasm. A ideia é que o programa compilado não precise mudar para alavancar os fios verdes, isso se torna a escolha do host sobre como executá-lo.
Outro recurso importante do WebAssembly é a execução determinística. Com threads verdes, deve ser simples implementar o modo de execução determinístico para destinos multithread.
O nome do espantalho para o recurso é _Wasmroutines_.

Encontrei alguns problemas relacionados a "threads de wasm nativos", como https://github.com/WebAssembly/design/issues/126 e https://github.com/WebAssembly/design/issues/1252, mas parece que são considerado como algo que poderia chegar eventualmente, mas bastante teórico neste ponto.

Eu acredito que a _implementação de thread de sistema único_ pode ser feita com esforço relativamente pequeno (por exemplo, poderia usar a memória linear normal) e forneceria muito valor (como executar qualquer programa multithread sem modificação) que vale a pena ter como um design separado proposta.

Comentários muito úteis

Existe um vídeo onde @rossberg apresenta uma proposta de design para continuações (mencionado por @lukewagner).

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

Todos 5 comentários

Você pode estar interessado no Asyncify , que é uma ferramenta de transformação de código que pode ser usada para pausar e retomar a execução ou alternar pilhas no WebAssembly sem exigir nenhum novo recurso do WebAssembly. Esta solução tem sobrecarga, e acredito que haja planos para propor um novo mecanismo para troca de pilha usando manipuladores de efeitos algébricos, que são essencialmente apenas exceções retomáveis. A proposta de exceções foi elaborada com essa direção futura em mente.

Obrigado @tlively. Asyncify parece uma solução provisória legal para o meu problema. Vou tentar fazer um protótipo em cima disso. Idealmente, gostaria de executar qualquer programa WebAssembly multithread sem qualquer modificação, usando apenas os recursos que o host fornece.

@mfateev Acho que você está certo; haveria um valor significativo no suporte de corrotinas. Já houve algumas discussões preliminares sobre a unificação do tratamento de exceções e corrotinas dentro da estrutura dos efeitos algébricos. Isso é discutido na antiga proposta de tratamento de exceções, e acho que @rossberg tem algum pensamento de design mais recente compatível com a nova proposta de tratamento de exceções.

Existe um vídeo onde @rossberg apresenta uma proposta de design para continuações (mencionado por @lukewagner).

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

Obrigado pelo vídeo. A "troca de pilha" é uma abstração muito poderosa que possibilitaria um grande número de casos de uso. Ansioso para que seja apoiado.

Meu ângulo é de alguma forma diferente ao propor nenhum novo recurso no bytecode wasm. Estou procurando fornecer a execução determinística para qualquer código multithread que use atomic.wait / Notice e outras operações atômicas. Acredito que possamos especificar um modo de execução de host especial que é essencialmente baseado em co-rotina, mas parece um tempo de execução multiencadeado para um aplicativo Web Assembly.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Artur-A picture Artur-A  ·  3Comentários

arunetm picture arunetm  ·  7Comentários

spidoche picture spidoche  ·  4Comentários

aaabbbcccddd00001111 picture aaabbbcccddd00001111  ·  3Comentários

bobOnGitHub picture bobOnGitHub  ·  6Comentários