如何通过worker_thread.Worker传递class个带函数的实例来使用函数?
How to pass class instances with function through worker_thread.Worker to use function?
为了上下文化,我想通过 NodeJS“worker_thread”模块的工作线程使用 class 实例函数。
在一个 main.js
文件中,我声明了一个 class 并实例化了一个通过 workerData
选项传递新实例的新 Worker。
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
脚本。
来看看吧。
process.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 不可能是具有功能的对象。实际上,它可以工作,但不会克隆所有功能。
我真的很困惑,因为我不知道如何解决这个问题。事实上,这个例子很简单,因为它简化了一个复杂的情况,但在我的例子中,我绝对需要在 process.js
端调用 c 函数,但我不知道如何做不同的事情。
希望你能帮助我。预先感谢您的宝贵时间。
问题是数据作为普通对象(没有原型)在父对象和工作对象之间发送。因此,要再次将其变成 class,在 worker 中您需要 class 代码并重新分配原型。
首先,您可以将 class 代码放入它自己的模块中,这样您就可以将它导入到父模块和工作模块中。然后,在worker中,你可以将原型赋值给你得到的对象。
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');
另一种方法是导入 class 代码,然后为 class 创建一个构造函数选项,从一个普通对象中获取数据并初始化一个新的 class实例。
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');
为了上下文化,我想通过 NodeJS“worker_thread”模块的工作线程使用 class 实例函数。
在一个 main.js
文件中,我声明了一个 class 并实例化了一个通过 workerData
选项传递新实例的新 Worker。
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
脚本。
来看看吧。
process.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 不可能是具有功能的对象。实际上,它可以工作,但不会克隆所有功能。
我真的很困惑,因为我不知道如何解决这个问题。事实上,这个例子很简单,因为它简化了一个复杂的情况,但在我的例子中,我绝对需要在 process.js
端调用 c 函数,但我不知道如何做不同的事情。
希望你能帮助我。预先感谢您的宝贵时间。
问题是数据作为普通对象(没有原型)在父对象和工作对象之间发送。因此,要再次将其变成 class,在 worker 中您需要 class 代码并重新分配原型。
首先,您可以将 class 代码放入它自己的模块中,这样您就可以将它导入到父模块和工作模块中。然后,在worker中,你可以将原型赋值给你得到的对象。
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');
另一种方法是导入 class 代码,然后为 class 创建一个构造函数选项,从一个普通对象中获取数据并初始化一个新的 class实例。
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');