gpt4 book ai didi

node.js - 子进程和fork进程 Node js之间共享对象

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:50 25 4
gpt4 key购买 nike

我正在使用 fork 处理子进程。但对一些事情感到完全困惑

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

我试图解释我的情况,首先我有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。注意 cluster 和worker(因为我使用的是 Node 10.19,所以不确定worker是否正常工作)我不想使用.可以使用 Folk 或 Spawn 来相互共享数据。如果不是,我如何使用线程实现我的要求?

最佳答案

这里有两个解决方案。第一个是使用 worker_threads 模块中的 Worker 类,但由于您不想更新 Node 版本,第二个解决方案是使用 fork来自 child_process 模块的函数。老实说,他们做的事情几乎相同,我无法判断哪个更好,但 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);
}
})
}
}

关于node.js - 子进程和fork进程 Node js之间共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60256476/

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