首页 > 解决方案 > go channels 和 goroutines 是如何翻译成 webassembly 的?

问题描述

用 Go 编程已经有一段时间了,最​​近开始研究 WebAssembly。虽然大多数事情都很简单,但对于将一些特定于 Go 的结构(如通道和 goroutines)转换为 wasm 有疑问。它们在 JS 中使用时的行为方式是否与在 Go 中相同(例如,goroutines 作为异步函数公开给 JS 等)?

标签: gollvmwebassemblyemscripten

解决方案


Go 编译器的 WASM 目标当前不支持线程,或者 Go 将它们称为“procs”。

这意味着,从语言用户的角度并稍微简化一下,在 WASM 上运行的 Go 程序的行为就像GOMAXPROCS=1在任何其他平台上运行的 Go 程序一样。

至关重要的是,只要您在代码中使用适当的同步,从正确性的角度来看,什么都不会改变。这包括通道和 goroutine 的语义,就像使用GOMAXPROCS=1.

其工作方式是在构建的 WASM 模块中包含 go 运行时(及其调度程序)。go 运行时,就像在这种情况下一样,GOMAXPROCS=1即使只有一个线程/proc 可用,也能够多路复用多个 goroutine 的执行。


推荐阅读