有没有办法 运行 使用工作线程的本机代码模块?

Is there a way to run native code modules using worker threads?

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

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

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);
}

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

但是,当创建多个worker时,返回这个错误:

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

这是在第二个线程上要求 "erlpack" module 的结果。

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

我尝试过重建模块、重新安装模块,甚至在创建工作人员的文件中要求模块并通过“workerData”传递它(没有用)。我也在不同的设备、运行 不同的操作系统(Ubuntu 和 Windows)上尝试过,并在 binding.gyp 中设置了“win_delay_load_hook”选项此模块的文件为“真”。

很遗憾,我找不到任何可行的解决方案。

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

问题是模块不是“上下文感知”的。

这一行:

必须更改为:

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