使用Web Assembly在Elixir中运行Go代码

使用Web Assembly在Elixir中运行Go代码

💡 原文英文,约1100词,阅读约需4分钟。
📝

内容提要

最近我在一个Elixir项目上工作,想要使用一个用Go编写的开源包。我搜索了不同的方法来与Elixir中的Go代码进行交互。我知道使用NIF可以很容易地与Elixir中的Rust代码进行交互,但是我没有找到类似的方法来与Go进行交互。大部分的研究都指向了使用Ports,我差点放弃,直到意识到WASI(WebAssembly System Interface)也是一个选择。我一直听说过Web Assembly,现在正好是尝试的好时机。我还发现了Wasmex,它似乎是在Elixir中运行WASI二进制文件的好选择。编译Go代码为WASI、在Elixir主机中运行WASI二进制文件、将数据传递给WASI二进制文件、从WASI二进制文件中获取数据,这些都是我需要弄清楚的事情。最后,我成功地实现了这个解决方案。这个方法对于大多数基本用例来说是一个完美的解决方案。

🎯

关键要点

  • 在Elixir项目中使用Go编写的开源包需要与Go代码进行交互。
  • 使用NIF与Rust代码交互简单,但与Go的交互方法较少。
  • WASI(WebAssembly System Interface)是与Go代码交互的一个可选方案。
  • Wasmex是一个在Elixir中运行WASI二进制文件的工具。
  • 编译Go代码为WASI需要使用tinygo,支持WASI作为输出目标。
  • 运行WASI二进制文件需要在Elixir中使用Wasmex库。
  • 通过stdin或共享WASI内存传递数据到WASI二进制文件,但字符串输入不被支持。
  • 使用管道(pipes)可以将数据传递给Go代码。
  • 从WASI二进制文件获取数据可以使用stdout管道。
  • 使用WASI调用Go代码相对简单,适合大多数基本用例。
  • 即使Elixir没有相关库,也可以通过Go与Elixir进行交互。
🏷️

标签

➡️

继续阅读