0

是否可以在工作线程上使用本机代码模块?

我正在创建每个工作线程,如图所示:

const { Worker } = require("worker_threads");
const auth = require("./auth.json");

const shardIds = [...Array(auth.shards).keys()];

for (let i = 0; i < shardIds.length; i++) {
    setTimeout(() => {
        new Worker("./bot.js", { workerData: { shardIds: [shardIds[i]], totalShards: auth.shards }});
    }, i * 5000);
}

...这似乎工作得很好。启动单个工作线程没有问题。

但是,当创建多个工作人员时,会返回此错误:

Error: Module did not self-register: '\\?\C:[file path]node_modules\erlpack\build\Release\erlpack.node'.

这是在第二个线程上需要“erlpack”模块的结果。

在搜索了这个问题的解决方案后,似乎我并不是唯一一个在多个线程上使用包含本机代码的模块时遇到困难的人。

我已经尝试重建模块,重新安装模块,甚至需要文件中的模块来创建工作人员并通过“workerData”传递它(这不起作用)。我还在不同的设备上尝试过,运行不同的操作系统(Ubuntu 和 Windows),并将binding.gyp该模块文件中的“win_delay_load_hook”选项设置为“true”。

不幸的是,我找不到任何可行的解决方案。

甚至有可能做到这一点吗?或者有没有另一种方法来创建多个进程,同时能够将数据传递到每个进程中,这也允许使用本机代码模块?

4

1 回答 1

1

问题在于模块没有“上下文感知”。

这一行:

NODE_MODULE

不得不改为:

NAN_MODULE_WORKER_ENABLED

...在js/erlpack.cc文件中,以便它与线程一起使用。

于 2021-07-31T01:30:32.637 回答