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