go channel 和 goroutines 如何转换为 webassembly?

Sam*_*Sam 7 llvm go emscripten webassembly

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

CAF*_*FxX 10

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

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

至关重要的是,只要您在代码中使用正确的同步,从正确性的角度来看,就不会发生任何变化。这包括通道和 goroutine 的语义,同样,当您使用GOMAXPROCS=1.

其工作方式是将 go 运行时(及其调度程序)包含在构建的 WASM 模块中。go 运行时,就像在 的情况下一样,GOMAXPROCS=1即使只有一个线程/过程可用,也能够复用多个 goroutine 的执行。请注意,由于 goroutine 是绿色线程,因此 go 运行时能够在它们阻塞时挂起它们(例如等待 I/O 或获取锁)并执行其他未阻塞的 goroutine。一旦 goroutine 解除阻塞(例如,因为 I/O 操作已完成,或者锁变得可用),它就会再次排队等待执行,并从中断处恢复。