go channels 和 goroutines 如何转换为 webassembly?

问题描述 投票:0回答:1

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

go webassembly emscripten
1个回答
8
投票

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

这意味着,从语言用户的角度来看,稍微简化一下,在 WASM 上运行的 Go 程序的行为与在任何其他平台上使用

GOMAXPROCS=1
运行的 Go 程序一样。

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

GOMAXPROCS=1
运行代码时这些语义不会改变一样。

其工作方式是在构建的 WASM 模块中包含 go 运行时(及其调度程序)。 go 运行时,就像

GOMAXPROCS=1
的情况一样,能够复用多个 goroutines 的执行,即使只有一个线程/proc 可用。请注意,由于 goroutines 是绿色线程,go 运行时能够在它们阻塞时挂起它们(例如等待 I/O 或获取锁)并执行其他未阻塞的 goroutines。一旦 goroutine 被解除阻塞(例如,因为 I/O 操作已经完成,或者锁变得可用),它会再次排队等待执行并从它停止的地方恢复。

© www.soinside.com 2019 - 2024. All rights reserved.