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

标签 node.js express

我正在使用 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/

相关文章:

node.js - NestJS - 微服务中的发布/订阅模式

javascript - 使用 jQuery 从 Ajax GET 响应中选择 HTML 元素

node.js - 如何重新翻译其他网站的图像(隐藏源 URL)

node.js - 为什么 formData 不能处理多个文件?

node.js - Express 如何处理路由, '#' 有何作用?

javascript - Express.js 静态服务不工作

node.js - 使用命令扩展运行 NPM 脚本会在返回结果之前解析结果 - 与 bash 不同

express - 为 webpack-dev-middleware 实现 historyApiFallback

javascript - 想读取特定 channel 的消息时出错

javascript - Fs 没有正确保存文件以及如何简化此代码