go - go channels 和 goroutines 是如何翻译成 webassembly 的?
问题描述
用 Go 编程已经有一段时间了,最近开始研究 WebAssembly。虽然大多数事情都很简单,但对于将一些特定于 Go 的结构(如通道和 goroutines)转换为 wasm 有疑问。它们在 JS 中使用时的行为方式是否与在 Go 中相同(例如,goroutines 作为异步函数公开给 JS 等)?
解决方案
Go 编译器的 WASM 目标当前不支持线程,或者 Go 将它们称为“procs”。
这意味着,从语言用户的角度并稍微简化一下,在 WASM 上运行的 Go 程序的行为就像GOMAXPROCS=1
在任何其他平台上运行的 Go 程序一样。
至关重要的是,只要您在代码中使用适当的同步,从正确性的角度来看,什么都不会改变。这包括通道和 goroutine 的语义,就像使用GOMAXPROCS=1
.
其工作方式是在构建的 WASM 模块中包含 go 运行时(及其调度程序)。go 运行时,就像在这种情况下一样,GOMAXPROCS=1
即使只有一个线程/proc 可用,也能够多路复用多个 goroutine 的执行。
推荐阅读
- javascript - 附加显示后找不到 Div:无
- c++ - 奇怪的输出打印字符数组
- string - 遍历列表以查找数据,并构造一个字符串
- python - python中的发票(收据)程序。如何防止覆盖旧值
- python - 仅将标签添加到 seaborn 散点图中的选定数据点
- javascript - 使用 Gravity Forms gform_field_validation 作为全名来检查名字和姓氏
- javascript - 在函数中反应太多的重新渲染
- c - C 编码 - 文本文件中的第一个数字没有按我预期的方式读取
- javascript - Fauna DB GraphQL 突变通过其 ID 更新表单的许多表单输入
- python - “ZeroDivisionError:整数除法或以零为模”