如何更好地利用 CPU 与 nodejs 作业服务器



下面是nodejs集群的简单实现,其中创建子进程以充分利用CPU内核。

const cluster = require('cluster'),
      http    = require('http'),
      numCPUs = 4;
if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++)
        cluster.fork()
} else {
   function1()
   function2()
   function3()
}

我有一个Jobserver,它可以处理作业的变量计数。 即在特定时间执行一次不同的独立函数 间隔。

上面的集群模型不能使用,因为我不希望每个分叉子执行所有函数。

如何在所有分叉子项之间分配这些功能,因此 每个孩子执行一组函数和我所有的 CPU 内核 被利用 ?

您可以检查worker.id为每个工作线程运行不同的函数,这记录在这里。

const cluster = require('cluster'),
      http    = require('http'),
      numCPUs = 4;
if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++)
        cluster.fork()
} else {
   const { id } = cluster.worker;
   console.log('I am worker #' + id);
   switch (id) {
       case 0: {
         function1();
       }
       case 1: {
         function2();
       }
       case 2: {
         function3();
       }
   }
}

编辑:另一种解决方案

const cluster = require('cluster'),
      http    = require('http'),
      numCPUs = 4;
const coreFunction = {
  0: () => { // core 1 functions
    function1();
    // could add multiple functions per core etc;
  },
  1: () => { // core 2 functions
    function2();
    function22();
  }
};
if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++)
        cluster.fork()
} else {
   const { id } = cluster.worker;
   console.log('I am worker #' + id);
   coreFunction[id]();
}

编辑:另一种解决方案#2

const cluster = require('cluster'),
      http    = require('http'),
      os = require('os');
const numCPUs = os.cpus().length;
const functions = [
    function1,
    function2,
    function3,
    function4,
    function5,
];
function chunk(arr, n) {
    return arr.slice(0,(arr.length+n-1)/n|0).
       map(function(c,i) { return arr.slice(n*i,n*i+n); });
}
const functionChunks = chunk(functions, numCPUs);
if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++)
        cluster.fork()
} else {
   const { id } = cluster.worker;
   console.log('I am worker #' + id);
   functionChunks[id].forEach(function (func) {
       func();
   })
}

最新更新