我和我的团队正在玩NodeJS(使用jsdom / jQuery)并解析存储在CouchDB中的大量HTML文档。 NodeJS是单线程的,因此在服务器中有8个核心最初对我们没有帮助,这就是我想知道如何最好地创建子进程(工作人员?)来处理从CouchDB中取出的单个文件?
这是我的思考过程:
我们根本没有运行网络服务器来处理任何这个(所有命令行),所以我不确定如何在通用的“设置CRON之外处理它,以便单独运行每个解析工作”。似乎工作人员通常用于处理来自网络服务器的请求。
思想?
答案 0 :(得分:2)
使用cluster
var cluster = require("cluster");
var numCPUs = require('os').cpus().length;
var htmlDocs = [...];
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('death', function(worker) {
console.log('worker ' + worker.pid + ' died');
});
} else {
for (var i = process.env.NODE_WORKER_ID; i < htmlDocs.length; i+=numCPUs) {
couch.doWork(htmlDocs[i]);
}
}
这是对数组中的成员进行处理然后通过让每个进程执行数组的子集而在多个进程上进行分解的经典案例。
注意我们如何按进程数增加i。这意味着工人1做第1,第5,第9等,工人2做第2,第6,第10等。