Разделение объекта между дочерним процессом и процессом fork node js - PullRequest
1 голос
/ 17 февраля 2020

Я работаю над дочерним процессом с использованием fork. но я запутался в нескольких вещах

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

Я пытаюсь объяснить свой senario, сначала у меня есть сервер. js где я инициализирую (начальная точка) сервер, а другой файл - моя задача. js откуда я выполняю тяжелую задачу, такую ​​как чтение больших файлов и отправка данных на другой сервер. Для отправки мне потребовалась авторизация с того сервера, чьи логики c присутствуют в main. js, и если произошла какая-либо ошибка, я отправляю электронное письмо с некоторыми подробностями для клиента. Ниже укажите код для электронной почты и авторизации в основном. 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()

В задании. 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);
 }
 })
  }
}

Я хочу запустить задание. js в еще одной теме. кластер и работник note (потому что я использую узел 10.19, поэтому не уверен, что работник работает должным образом) я не хочу использовать. Можно использовать фолк или спавн для обмена данными между собой. Если не так, как я могу достичь своего требования с помощью потока?

1 Ответ

2 голосов
/ 17 февраля 2020

Вот два решения. Первый использует класс Worker из модуля worker_threads, но поскольку вы не хотите обновлять версию узла, второе решение использует функцию 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' });

и способ получения. 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);
     }
   })
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...