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

web worker 比原生线程更重还是更轻

使用 Emscripten Worker API 传输数据而无需复制

emscripten 集成web常用编译命令

如何通过 Web Worker 中的 Worklight 适配器调用 Web 服务

如何使用 Socket.io 和 emscripten 使用 javascript 库?