nodejs worker_threads如何了解所有工作人员已完成工作

时间:2019-11-21 10:48:40

标签: node.js multithreading worker

开始研究nodejs中的worker_threads
工作完成后,最后一个工作人员必须完成脚本
process.exit();

我的index.js

const { Worker } = require("worker_threads");
const logUpdate = require("log-update");
const threads = 100;
const someData = 'some data';

let names = [...Array(threads)].fill(0);
for (let i = 0; i < threads; i++) {

    const port = new Worker(require.resolve("./worker.js"), {
        workerData: { someData, i }
    });

    port.on("message", (data) => handleMessage(data, i));
    port.on("error", (e) => console.log(e));
    port.on("exit", (code) => console.log(`Exit code: ${code}`));
}

function handleMessage(_, index) {
    names[index]++;
    logUpdate(names.map((status, i) => `Thread ${i}: ${status}  ${_}`).join("\n"));
}

worker.js

const { parentPort, workerData } = require("worker_threads" )
const { someData, i } = workerData;

(async () => {
    parentPort.postMessage( `worker start ${i} some data ${someData}`);
    process.exit();
})();

现在可以创建工作人员并进行工作了,但是完成工作后,脚本无法完成工作

1 个答案:

答案 0 :(得分:0)

据我所知,我知道如果在工作程序退出之前没有引起任何错误,则返回码为0,否则为1(自动)。看process exit codes

因此,当您此时执行process.exit()时,可以将代码作为参数传递。 (或完全没有process.exit())。

一般来说,我所看到的是:

  1. 将工作程序创建包装在Promise返回函数中。
    注意:

    • worker.terminate():终止工作线程。
    • (个人选择)如果完成任务,我会选择parentPort.postMessage(JSON.stringify(true)) 在我的工作线程中。因此,在主线程中是
      worker.on('message', message => {if (message === true) {worker.terminate();resolve(true);} else {console.log(message)}});

  2. 每当我不得不为重复的任务委托创建线程时。我在数组上使用.map函数。内部函数返回的返回值与我的工作程序创建者(承诺的返回)函数的返回值相同。因此,最终我将数组映射到Promise数组中。

  3. 然后我将这一系列承诺放入Promise.all()。
  4. 然后我检查Promise.all()的返回值


结帐:

  1. My Gist(以Promise.all()为例)。
  2. Medium(仅适用于worker_thread基础。真棒文章)