【问题标题】:How can I use an emscripted .js library in a Web Worker如何在 Web Worker 中使用 emscripted .js 库
【发布时间】:2014-07-26 07:36:14
【问题描述】:

我已将我的程序编译为单个 program.js 文件,并在 worker 中调用:

importScripts('program.js');
Module.callMain();

但是,虽然 callMain 正在执行,但在该函数调用的堆栈中,我收到了 Undefined is not a function 错误。

我的预感是我还没有阅读一些重要的 emscripten 文档、wiki 或源代码。

我知道的:

  • emscripten 具有与工作线程一起工作的绑定,但仅当主线程上有一个 emscripted 进程使用这些绑定时(请参阅emscripten.h
  • 为了将任务(在主线程上运行的库中)编译到工作线程,emcc 需要在编译时为该任务传递特殊选项(请参阅 settings.js

我的猜测:

  • 可能需要传递一些标志,让 emcc 知道不要在不存在的对象上调用函数,例如 window
  • 查看了/dev/tty 的实现,它与/dev/stdin 链接,以及/dev/stdout 的实现,我相信可能会输出到console,我认为不支持在工人中

我在问什么:

  • 如何在 worker 中使用我的库(单个 js 文件)?
    • 我的库会从 program.data 文件中加载其他文件,如果有影响的话

提前致谢。如果我可以添加任何详细信息,请告诉我。


注意:顶部的代码已简化 - 似乎不是语法错误。

更新:

  • stacktrace (Error.stack) 只告诉我错误发生在Module.callMain。它没有告诉我有关可能导致它的导入脚本的任何信息。 :(

【问题讨论】:

    标签: javascript web-worker emscripten


    【解决方案1】:

    Emscripten 输出应该在网站、网络工作者或节点上运行,所有这些都无需修改。可能存在一些限制(例如,在工作人员中没有要渲染的画布),但除此之外,它只是可以在这三种环境中运行的纯 JS。

    emscripten 生成的完全相同的 JS 文件是否可以在工作人员之外工作?

    如果callMain() 失败,请检查您的项目是否具有main() 函数。

    【讨论】:

    • 应该 main 需要是一个导出函数 (_main)?
    【解决方案2】:

    在加载 js 之后(importScripts()),它可能还没有被执行,因此你还没有准备好。当一切准备就绪时,您可以要求 Emscripten 为您调用回调。您将可以通过变量Module 访问函数。

    var Module = {
        preRun:[],
        onRuntimeInitialized: function load_done_callback() {
            console.info("The Module is loaded and is accessible here", Module);
            console.inf("no need to call main() though", Module._main); // add "_" before your function names
        },
    };
    
    importScripts('program.js');
    

    无需致电callMain()Module._main(),它会为您调用。您可能需要在编译器命令行中设置NO_EXIT_RUNTIME=1

    em++  \
      -s EXPORTED_FUNCTIONS="['_main', '_myfunction1' , '_my_function2' ]" \
      -s NO_EXIT_RUNTIME=1 \
      -s DEMANGLE_SUPPORT=1 \
      program.cpp \
      -o ./program.js
    

    请注意,在使用importScripts() 的情况下,您不需要作为工作人员进行编译。

    【讨论】:

    • 我注意到简单地调用importScripts() 而不使用同步加载回调onRuntimeInitialized: 对我有用。但我不确定是否可以保证工作。
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2023-02-18
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多