2012-02-22 50 views
1

我和我的團隊正在使用NodeJS(帶有jsdom/jQuery)並解析存儲在CouchDB中的很多HTML文檔。 NodeJS是單線程的,所以在一個服務器中有8個內核根本不能幫助我們,這正是我想知道如何最好地創建子進程(工作人員?)來處理從CouchDB中取出的單個文件的位置?節點JS與CouchDB進行大量解析

這裏是我的思維過程:

  1. 主要的NodeJS腳本通過CouchDB的視圖循環從文件得到HTML文件每隔X分鐘
  2. 菌種的過程解析(jsdom/jQuery的)並存儲結果,從每個HTML文件

我們沒有運行任何網絡服務器來處理這些(所有的命令行),所以我不確定如何處理這個通用的「設置CRON只運行每個解析單獨工作「。似乎工作人員通常用於處理來自Web服務器的請求。

想法?

回答

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等。

+0

謝謝!我認爲這是我們將要使用的。 – Thomas 2012-02-22 20:01:32