node.js - 无法在 worker_threads 中调用类实例方法
问题描述
我正在为 node.js 'worker_threads' 苦苦挣扎。
所以我想做的是将我的自定义类的几个实例传递给工作线程。实例通过一些唯一的序列号分配给映射。所以基本上,我有一个类型的 Map - <string, MyUniqueClassInstance>。
我的工作人员实现如下所示:
运行工作服务的类方法:
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));
每当在“计数”方法中尝试从项目实例运行方法时,它都会引发错误
myMapEntry.myCustomInstanceMethod is not a function
在将实例传递给 .count() 方法之前,我尝试 console.log() 内容,一切都已正确解决。
相同的模式在工作实例之外完美运行。
谁能帮我找出这段代码中到底有什么可能出错的地方?
解决方案
你不能传递函数(例如类的实例不能工作,至少它们的方法不能)——你只能传递可序列化的数据。
https://nodejs.org/api/worker_threads.html#worker_threads_worker_workerdata
一个任意 JavaScript 值,其中包含传递给此线程的 Worker 构造函数的数据的克隆。
根据 HTML 结构化克隆算法,就像使用 postMessage() 一样克隆数据。
那么我们来看看HTML结构化克隆算法
结构化克隆无法使用的功能对象无法通过结构化克隆算法进行复制;试图抛出 DATA_CLONE_ERR 异常。
您是否可以使用序列化数据重建类的实例,调用您的方法,然后将序列化数据返回给父线程?
推荐阅读
- python - 从中获取文本
在 python 中具有类或 id 的网站上
- asp.net - 自定义错误模式设置为“RemoteOnly”,本地调试仍然显示自定义错误页面
- wordpress - 如何在我的服务器上托管我自己的自定义 Wordpress 主题?
- audio - Vimeo 嵌入问题:默认情况下,音频音量一直被调低
- google-chrome-devtools - Chrome 开发人员返回到 Sources 选项卡
- plot - 如何在 r 中用 xgboost 和 decision_tree 绘制树?
- azure - API 管理开发人员门户 CI/CD
- angular - 我应该为多个接口创建一个类或服务吗?
- elasticsearch - Elasticsearch Shard 分布大小差异很大
- c# - 从 MailItem (Microsoft.Office.Interop.Outlook) 中查找重复的电子邮件?