Design: Wasmroutines

创建于 2019-12-30  ·  5评论  ·  资料来源: WebAssembly/design

现有的 WebAssembly线程提案侧重于使 wasm 编译的程序能够利用多个系统线程。 对于 CPU 密集型任务来说,这是一项非常有用的功能。 但是有一大类问题是 IO 密集型的,并且通过比系统线程轻得多的协程可以更好地解决。 最近将 Rust async-wait 添加到已经支持多线程的语言中就是这种需求的一个很好的例子。 async-await 的问题在于它需要一种完全不同的方式来编写应用程序代码以及不同的编译技术。 另一方面,Go 流行的主要原因之一是 goroutines 对开发人员来说看起来像真正的线程,而由运行时作为协程执行。
我相信 WebAssembly 具有独特的优势,可以将 Go 线程模型的优势带到几乎任何可以编译为 wasm 的多线程应用程序中。 这个想法是编译的程序不需要更改以利用绿色线程,这成为主机选择如何执行它。
WebAssembly 的另一个重要特性是确定性执行。 使用绿色线程,为多线程目标实现确定性执行模式应该很简单。
该功能的稻草人名称是 _Wasmroutines_。

我发现了一些与“原生 wasm 线程”相关的问题,例如https://github.com/WebAssembly/design/issues/126https://github.com/WebAssembly/design/issues/1252但看起来它们是被认为是 wasm 最终可能会得到的东西,但在这一点上非常理论化。

我相信 _single system thread implementation_ 可以通过相对较小的努力来完成(例如它可以使用普通的线性内存)并且会提供很多值得作为单独设计的价值(例如无需修改即可执行任何多线程程序)提议。

最有用的评论

有一个视频, @rossberg展示了延续的提议设计(@lukewagner 提到)。

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

所有5条评论

您可能对Asyncify感兴趣,它是一种代码转换工具,可用于在 WebAssembly 中暂停和恢复执行或切换堆栈,而无需任何新的 WebAssembly 功能。 这个解决方案有开销,我相信有计划提出一种使用代数效应处理程序进行堆栈切换的新机制,这基本上只是可​​恢复的异常。 例外提案的设计考虑到了这个未来的方向。

谢谢@tlively。 Asyncify 看起来像是解决我的问题的很酷的权宜之计。 我会尝试在它上面做原型。 理想情况下,我希望仅使用主机提供的功能来执行任何多线程 WebAssembly 程序而无需任何修改。

@mfateev我认为你是对的; 支持协程将具有重要价值。 已经有一些关于在代数效应框架内统一异常处理和协程的初步讨论。 这在旧的异常处理提案中讨论过,我认为@rossberg有一些与新的异常处理提案兼容的新设计思想。

有一个视频, @rossberg展示了延续的提议设计(@lukewagner 提到)。

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

谢谢你的视频。 “堆栈切换”是一个非常强大的抽象,可以支持大量用例。 期待得到支持。

在提出 wasm 字节码中没有新功能方面,我的角度有些不同。 我正在研究为使用 atomic.wait/notify 和其他原子操作的任何多线程代码提供确定性执行。 我相信我们可以指定一种特殊的主机执行模式,它本质上是基于协程的,但对于 Web 程序集应用程序来说,它看起来像多线程运行时。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

aaabbbcccddd00001111 picture aaabbbcccddd00001111  ·  3评论

Artur-A picture Artur-A  ·  3评论

nikhedonia picture nikhedonia  ·  7评论

artem-v-shamsutdinov picture artem-v-shamsutdinov  ·  6评论

beriberikix picture beriberikix  ·  7评论