簡體   English   中英

如何讓主節點等待工作人員在 nodejs 集群中完成

[英]How can I make the master wait for workers to complete in nodejs cluster

我在 Nodejs 集群上部署了一個應用程序,其中一個 master 分叉了 worker。 工作人員進行一些數據庫活動(這可能需要一段時間),然后必須將一些結果發送回主服務器。 這是我所擁有的骨架。 當我運行它時,主人沒有收到來自工人的一些消息。 我怎樣才能讓主人等到它收到所有工人的消息。

if ( isMaster ) {
 for(k=0; k<nodes; k++)
        {
                cluster.fork();
                console.log("Started Node-" + k);

        }
    for (const id in cluster.workers) {
             var worker = cluster.workers[id];
             worker.on('exit', () => {
                        console.log('worker', id . ' Exited');      
                });
                worker.on('message', (msg) => {
                        console.log ("msg recvd by id:", id, 'msg:', msg);
                        consumeMsg(msg);
                });

} else { // isWorker 
       // do some database work, potentially long running (in tens of seconds)
                      .....
       process.send( { results: dbResults, ID: cluster.worker.id} );
}

這是您想要一個工人的簡單版本

const { Worker, isMainThread, parentPort } = require('worker_threads');

const MESSAGE_COUNT = 10;

function main() {
  if (isMainThread) {
    // instanciate worker
    const worker = new Worker(__filename);
    // receive worker responses
    worker.on('message', (message) => {
      console.log('worker response', message);
    });
    // send some messages
    for (let i = 0; i < MESSAGE_COUNT; i++) {
      worker.postMessage('message ' + parseInt(i));
    }
    // ask the worker to stop
    worker.postMessage('exit');
  } else {
    // receive parent message
    parentPort.on('message', (message) => {
      // handle exit case
      if (message == 'exit') {
        parentPort.unref();
      }
      // do some work
      console.log('worker: message from main', message);
      // send result back
      parentPort.postMessage('response to:' + message);
    });
    parentPort.on('exit', () => {
      // do some closing actions
      console.log('worker closing');
    });
  }
};

main();

output:

worker: message from main message 0
worker response response to:message 0
worker response response to:message 1
worker response response to:message 2
worker response response to:message 3
worker response response to:message 4
worker response response to:message 5
worker response response to:message 6
worker response response to:message 7
worker response response to:message 8
worker response response to:message 9
worker response response to:exit
worker: message from main message 1
worker: message from main message 2
worker: message from main message 3
worker: message from main message 4
worker: message from main message 5
worker: message from main message 6
worker: message from main message 7
worker: message from main message 8
worker: message from main message 9
worker: message from main exit

對於幾個工人,你可以做同樣的事情

const { Worker, isMainThread, parentPort } = require('worker_threads');

const MESSAGE_COUNT = 10;

function createWorker(name) {
  // instanciate worker
  const worker = new Worker(__filename);
  // receive worker responses
  worker.on('message', (message) => {
    console.log('worker ' + name + ' response', message);
  });
  // send some messages
  for (let i = 0; i < MESSAGE_COUNT; i++) {
    worker.postMessage(name + ' message ' + parseInt(i));
  }
  // ask the worker to stop
  worker.postMessage('exit');
}

function main() {
  if (isMainThread) {
    createWorker('one');
    createWorker('two');
  } else {
    // receive parent message
    parentPort.on('message', (message) => {
      // handle exit case
      if (message == 'exit') {
        parentPort.unref();
      }
      // do some work
      console.log('worker: message from main', message);
      // send result back
      parentPort.postMessage('response to:' + message);
    });
    parentPort.on('exit', () => {
      // do some closing actions
      console.log('worker closing');
    });
  }
};

main();

output:

worker: message from main one message 0
worker one response response to:one message 0
worker one response response to:one message 1
worker one response response to:one message 2
worker one response response to:one message 3
worker one response response to:one message 4
worker one response response to:one message 5
worker one response response to:one message 6
worker one response response to:one message 7
worker one response response to:one message 8
worker one response response to:one message 9
worker one response response to:exit
worker: message from main two message 0
worker two response response to:two message 0
worker two response response to:two message 1
worker two response response to:two message 2
worker two response response to:two message 3
worker two response response to:two message 4
worker two response response to:two message 5
worker two response response to:two message 6
worker two response response to:two message 7
worker two response response to:two message 8
worker two response response to:two message 9
worker two response response to:exit
worker: message from main one message 1
worker: message from main one message 2
worker: message from main one message 3
worker: message from main one message 4
worker: message from main one message 5
worker: message from main one message 6
worker: message from main one message 7
worker: message from main one message 8
worker: message from main one message 9
worker: message from main exit
worker: message from main two message 1
worker: message from main two message 2
worker: message from main two message 3
worker: message from main two message 4
worker: message from main two message 5
worker: message from main two message 6
worker: message from main two message 7
worker: message from main two message 8
worker: message from main two message 9
worker: message from main exit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM