【问题标题】:Can't call a class instance method inside worker_threads无法在 worker_threads 中调用类实例方法
【发布时间】:2020-10-23 22:50:02
【问题描述】:

我正在为 node.js 'worker_threads' 苦苦挣扎。

所以我想做的是将我的自定义类的几个实例传递到工作线程中。 实例通过一些唯一的序列号分配给映射。 所以基本上,我有一个类型的 Map - .

我的 worker 实现如下所示:

运行工作服务的类方法:

public static runService = (workerData:any) => {
        return new Promise((resolve, reject) => {
            const route = path.join(__dirname, '/worker.js');
            const worker = new Worker(route, { workerData });
            worker.on('message', resolve);
            worker.on('error', reject);
            worker.on('exit', (code:number) => {
            if (code !== 0)
                reject(new Error(`Worker stopped with exit code ${code}`));
            })
        })
    }

工人本身:

const { workerData, parentPort } = require('worker_threads')

const instance = new Counter();
const {items, myMap} = workerData;
const pResponseList:Promise<any>[] = [];

items.map((item: Item) => {
    pResponseList.push(
        instance.count(item, myMap.get(item._id)!)
    );
});

Promise.all(pResponseList).then(res => parentPort.postMessage(res));

每当我在“count”方法中尝试从项目实例运行一个方法时,它都会引发错误

myMapEntry.myCustomInstanceMethod is not a function

在将实例的内容传递给 .count() 方法之前,我尝试了 console.log() 内容,一切都已正确解决。

相同的模式在工作实例之外完美运行。

谁能帮我找出这段代码中到底有什么潜在的错误?

【问题讨论】:

    标签: node.js typescript node-worker-threads


    【解决方案1】:

    你不能传递函数(例如类的实例不能工作,至少它们的方法不能)——你只能传递可序列化的数据。

    https://nodejs.org/api/worker_threads.html#worker_threads_worker_workerdata

    一个任意的 JavaScript 值,其中包含传递给此线程的 Worker 构造函数的数据的克隆。

    根据 HTML 结构化克隆算法,就像使用 postMessage() 一样克隆数据。

    那我们去HTML structured clone algorithm

    结构化克隆不适用的事情 结构化克隆算法不能复制函数对象;试图抛出 DATA_CLONE_ERR 异常。

    您是否可以使用序列化数据重构类的实例,调用您的方法,然后将序列化数据返回给父线程?

    【讨论】:

    • 谢谢@Adam,不知道这个案子。我认为这可以解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多