gpt4 book ai didi

javascript - 如何通过worker_thread.Worker传递带函数的类实例来使用函数?

转载 作者:行者123 更新时间:2023-12-04 12:16:06 24 4
gpt4 key购买 nike

为了上下文化,我想通过 NodeJS“worker_thread”模块中的工作线程来使用类实例函数。
合一main.js文件我声明一个类并实例化一个新的 Worker,通过 workerData 传递新实例选项。
main.js

const { Worker } = require('worker_threads');

class obj {
constructor() {
this.a = "12";
this.b = 42;
}

c() {
return 'hello world';
}
}

let newobj = new obj();
console.log({
a: newobj.a,
b: newobj.b,
c: newobj.c()
});
//Output: { a: '12', b: 42, c: 'hello world' }

let worker = new Worker('./process.js', { workerData: { obj: newobj } });
worker.once('message', res => { console.log({ res }) });
如您所见,工作人员调用了 process.js脚本。
让我们看看。
进程.js
const { parentPort, workerData } = require('worker_threads');

let { obj } = workerData;

console.log({
a: obj.a,
b: obj.b,
c: obj.c()
});

parentPort.postMessage('DONE');
如您所知,此代码引发错误: TypeError: obj.c is not a function .事实上,在检查了 Worker Thread 文档 ( https://nodejs.org/dist./v10.22.0/docs/api/worker_threads.html#worker_threads_new_worker_filename_options) 之后,我发现 Worker 不可能是具有函数的对象。实际上,它可以工作,但所有功能都没有被克隆。
Screen capture of worker_thread workerData options definition in NodeJS official documentation
我真的很困惑,因为我不知道如何解决这个问题。事实上,这个例子很简单,因为它简化了一个复杂的情况,但在我的情况下,我绝对需要调用 process.js 中的 c 函数一边,但我不知道该怎么做。
我希望你能帮助我。在此先感谢您的时间。

最佳答案

问题是数据在父对象和 worker 之间作为普通对象(没有原型(prototype))发送。所以,要让它再次成为一个类,在worker中你需要类代码和重新分配原型(prototype)。
首先,您可以将类代码放入它自己的模块中,这样您就可以将其导入到父级和 worker 中。然后,在worker中,你可以将原型(prototype)分配给你得到的对象。

const { parentPort, workerData } = require('worker_threads');
let { obj } = workerData;
const NewObj = require('./newobj');
Object.setPrototypeOf(obj, NewObj.prototype);

console.log({
a: obj.a,
b: obj.b,
c: obj.c()
});

parentPort.postMessage('DONE');

另一种方法是导入类代码,然后为该类创建一个构造函数选项,该选项从普通对象中获取数据并用它初始化一个新的类实例。
const { parentPort, workerData } = require('worker_threads');
const NewObj = require('./newobj');

// create a NewObj from scratch and let it initialize itself from the object that
// was passed to our worker
let obj = new NewObj(workerData.obj);

console.log({
a: obj.a,
b: obj.b,
c: obj.c()
});

parentPort.postMessage('DONE');

关于javascript - 如何通过worker_thread.Worker传递带函数的类实例来使用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64920455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com