我正在使用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);
}
})
}
}