在子进程和fork进程Node js之间共享对象



我正在使用fork处理子进程。但在的一些事情上完全混淆了

• will it (process)pass app object instance eg:- let app = express(); using IPC

我试图解释我的senario,首先我有server.js,在这里我初始化(起点(服务器,而另一个文件是我的task.js,我在这里执行繁重的任务,比如读取大文件数据并将数据发送回其他服务器。对于发送,我需要来自main.js中存在逻辑的服务器的授权,如果出现任何错误,我会向客户端发送几乎没有详细信息的电子邮件。下面提供main.js 中的电子邮件和授权代码

Let task = require('./task.js')
app.sendEmail = function (message, emailinfo, attachment){
// my email logic
}
app.auth= function(host,port)
// Authorization logic
}
New task(app).run()

在task.js中(示例代码(

Class Task { 
constructor(app){
this.app =app
}
run(){
fs.readfile('myfile',function(err,data){
if(err){ let msg =err; 
let clientinf; clientinf.to = "client email"; 
clientinf.cc = " other user in CC";
this.app.sendEmail(msg, clientinf, attach);
}else{
let host='other server url';
let port='port';
this.app.auth(host,port);
}
})
}
}

我想在另一个线程中运行task.js。注意集群和worker(因为我使用的是节点10.19,所以不确定worker是否正常工作(我不想使用。可以使用folk或spawn在彼此之间共享数据。如果不是,我如何使用线程来实现我的要求?

这里有两个解决方案。第一种解决方案是使用worker_threads模块中的Worker类,但由于您不想更新节点版本,因此第二种解决方案使用child_process模块的fork函数。老实说,他们做的事情基本上是一样的,我不知道哪一个更好,但worker_threads解决方案是最近的。

解决方案1:

const { Worker } = require('worker_threads')
const task_script = path.join(__dirname, "./task.js")
const obj = {data:"data"}
const worker = new Worker(task_script, {
workerData: JSON.stringify(obj)
})
worker.on("error", (err) => console.log(err))
worker.on("exit", () => console.log("exit"))
worker.on("message", (data) => {
console.log(data)
res.send(data)
})

并且您必须稍微更改task.js代码。这是

const { parentPort, workerData, isMainThread } = require('worker_threads')
class Task { 
constructor(app){
this.app = app
}
run(){
if (!isMainThread) {
console.log("workerData: ", workerData) //you have worker data here 
fs.readfile('myfile',function(err,data){
if(err){ let msg = err; 
let clientinf; clientinf.to = "client email"; 
clientinf.cc = " other user in CC";
this.app.sendEmail(msg, clientinf, attach);
parentPort.postMessage(msg) //use can send message to parent like this
} else {
let host='other server url';
let port='port';
this.app.auth(host,port);
}
})
}
}
}

这是第二个解决方案

const { fork } = require('child_process');
const forked = fork('task.js');
forked.on('message', (msg) => {
console.log('Message from child', msg);
});
forked.send({ hello: 'world' });

以及使用这种方法发送和接收数据的taks.js方式

class Task { 
constructor(app){
this.app = app
}
run(){
//receive
process.on('message', (msg) => {
console.log('Message from parent:', msg);
});
fs.readfile('myfile',function(err,data){
if(err){ let msg = err; 
let clientinf; clientinf.to = "client email"; 
clientinf.cc = " other user in CC";
this.app.sendEmail(msg, clientinf, attach);
process.send(msg); //send method
} else {
let host='other server url';
let port='port';
this.app.auth(host,port);
}
})
}
}

最新更新