node.js - 如何通过nodejs jobserver更好地利用CPU

标签 node.js

下面给出的是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()
}

What I have is a Jobserver which processes variable counts of jobs. ie, executes different independent functions once in specific time intervals.

无法使用上述集群模型,因为我不希望每个 fork 的子级都执行所有功能。

How do I distribute these functions among all the forked child, so that each child executes a set of functions and all of my CPU cores are utilised ?

最佳答案

您可以检查worker.id来为每个工作人员运行不同的功能,这记录在here中.

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();
   })
}

关于node.js - 如何通过nodejs jobserver更好地利用CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49426143/

相关文章:

node.js - Express/torrent-stream : writing a file from stream, 使用 url 向客户端发送套接字,但客户端找不到文件

javascript - 恼人和奇怪的正则表达式问题 : 'io\.' get's a match on the word 'function'

node.js - OpenAI 嵌入 API : How to change the embedding output dimension?

javascript - Node.js 命令行中调用函数

javascript - 缓存静态页面和内容nodejs

node.js - Node Express 模块抛出 'has no method urlencoded' 错误

node.js - 为 Ansible 安装 NodeJS LTS

javascript - react : Elements not displayed after Nodejs API response

javascript - Stream.Transform 在 Node 中究竟是如何工作的?

node.js - 我如何将 RASA 套件与 NodeJS 集成