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

问题描述

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

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

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”选项设置为“true”。

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

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

解决方法

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

这一行:

NODE_MODULE

必须改为:

NAN_MODULE_WORKER_ENABLED

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