Web Worker 中的 Emscripten WASM:“模块不是对象或函数”
Posted
技术标签:
【中文标题】Web Worker 中的 Emscripten WASM:“模块不是对象或函数”【英文标题】:Emscripten WASM in web worker: "module is not an object or function" 【发布时间】:2018-03-27 15:24:01 【问题描述】:我正在尝试关注 tutorials 在 webworker 中运行 emscripten 构建的 Web 程序集。
当我实例化我的模块时,我得到WebAssembly Instantiation: Import #9 module="global" error: module is not an object or function
。
这是我生成一个工人并将编译后的模块发送给它的代码:
var g_worker = new Worker('worker.js');
WebAssembly.compileStreaming(fetch('my_module.wasm'))
.then(module =>
g_worker.postMessage(module);
);
worker.js:
self.onmessage = function (evt)
var module = evt.data;
var config =
env:
memoryBase: 0,
tableBase: 0,
memory: new WebAssembly.Memory(initial: 256),
table: new WebAssembly.Table(initial: 0, element: 'anyfunc')
,
imports:
imported_func: function(arg)
console.log(arg);
;
WebAssembly.instantiate(module, config);
我使用这些标志构建我的模块:
-I include \
-I third_party/eigen-git-mirror \
-s EXPORTED_FUNCTIONS="['_my_function', '_malloc', '_free']" \
-s EXPORT_NAME="'MyModule'" \
-s NO_FILESYSTEM=1 \
-s MODULARIZE=1 \
-s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' \
-s BUILD_AS_WORKER=1 \
--memory-init-file 0 \
-s WASM=1 \
-s NO_EXIT_RUNTIME=1 \
-s ALLOW_MEMORY_GROWTH=1 \
-s TOTAL_MEMORY=256MB \
--closure 1 \
-g3
如果我将global: ,
添加到config
字典,它会抱怨Import #11 module="global.Math" error: module is not an object or function
,如果我再添加'global.Math: Math
,我会得到memory import 0 is smaller than initial 4096, got 256
,依此类推,直到我觉得我是被打的鼹鼠。
我怀疑我做错了。
【问题讨论】:
【参考方案1】:我想我明白了。如果我从头开始并在我的第一个文件和 worker.js 中保留 var g_worker = new Worker('worker.js')
:
self.importScripts('my_module.js');
它有效。看来我只是看错了教程。
【讨论】:
以上是关于Web Worker 中的 Emscripten WASM:“模块不是对象或函数”的主要内容,如果未能解决你的问题,请参考以下文章
Emscripten 中的“Module”变量机制,同时将 Pthread 编译为 worker
使用 Emscripten Worker API 传输数据而无需复制