【问题标题】:How are go channels and goroutines translated to webassembly?go channels 和 goroutines 是如何翻译成 webassembly 的?
【发布时间】:2021-08-07 00:58:33
【问题描述】:

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

【问题讨论】:

  • 这是一个有趣的问题。你自己试过了吗?
  • 我有,它们在 JS 中正常工作。我知道 wasm 中不允许阻塞的函数,我们应该使用 goroutines 来缓解,但是它如何在内部转换为 wasm?

标签: go llvm webassembly emscripten


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 2021-01-09
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2015-05-12
    相关资源
    最近更新 更多