experiment golang call wasm, and writing wasm in golang
以fib算法来验证,不管是并发还是单线程速度, wasm机制 + wasmer-go 性能最好,接近源生性能。
测试并没有多少问题
最普通的是 http请求
还没有涉及到调用,仅仅是定义了就遇到问题:
wazero:
resolve imports: clock_time_get: not exported in module wasi_snapshot_preview1
=== RUN Test_wazero_tinygo_Fibonacci
/data/apps/github.com/wuhuizuo/go-wasm-go/runner/wazero.go:29: resolve imports: clock_time_get: not exported in module wasi_snapshot_preview1
--- FAIL: Test_wazero_tinygo_Fibonacci (0.01s)
wasmer:
Missing import: `env`.`time.resetTimer`
=== RUN Test_wasmer_tinygo_Fibonacci
/data/apps/github.com/wuhuizuo/go-wasm-go/runner/wasmer_tinygo.go:36: Missing import: `env`.`time.resetTimer`
--- FAIL: Test_wasmer_tinygo_Fibonacci (2.52s)
FAIL
FAIL github.com/wuhuizuo/go-wasm-go/runner 2.561s
wasmedge:
[2021-12-15 20:08:57.648] [error] instantiation failed: unknown import, Code: 0x62
[2021-12-15 20:08:57.648] [error] When linking module: "env" , function name: "time.resetTimer"
[2021-12-15 20:08:57.648] [error] At AST node: import description
[2021-12-15 20:08:57.648] [error] At AST node: import section
[2021-12-15 20:08:57.648] [error] At AST node: module
--- FAIL: Test_wasmedge_tinygo_Fibonacci (0.08s)
wasmedge.go:28: unknown import
定义:
//export RequestHTTP
func RequestHTTP(username, password string) {
provider.RequestHTTP(username, password)
}
可能可以参照这个实现进行导入 host 的东西。 https://github.com/mosn/proxy-wasm-go-host/blob/3fb13ba763a662bde51f0f324d465d04d8458449/proxywasm/v2/imports.go#L22
当相关的包中import 了 net/http
package后, 会遇到问题:
panic: syscall/js: call of Value.Get on undefined
goroutine 1 [running]:
syscall/js.Value.Get({{}, 0x0, 0x0}, {0x384f8, 0x9})
/usr/local/go/src/syscall/js/js.go:299 +0xc
syscall.init()
/usr/local/go/src/syscall/fs_js.go:21 +0x12
FAIL github.com/wuhuizuo/go-wasm-go/runner 0.714s
即时没有使用下面的语句申明也是一样有问题:
js.Global().Set("RequestHTTP", js.FuncOf(wasmutil.Wrap(provider.RequestHTTP)))