微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在worker_threads中调用类实例方法

如何解决无法在worker_threads中调用类实例方法

我正在努力处理node.js'worker_threads'。

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

我的工作程序实现如下:

运行辅助服务的类方法

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

我试图在将实例的console.log()内容传递给.count()方法之前,将其内容正确放置。

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

有人可以帮助我找出这段代码中到底有什么潜在错误吗?

解决方法

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

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

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

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

然后转到HTML structured clone algorithm

不适用于结构化克隆的事物 结构化克隆算法无法复制功能对象;尝试引发DATA_CLONE_ERR异常。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。