2014-01-19 27 views
0

我下面的例子給出here 創建將在多個cores.I運行服務器收到以下錯誤:創建使用節點JS新工藝不具備的pid

created worker: undefined 
created worker: undefined 
created worker: undefined 
created worker: undefined 

workers[m.process].lastCb=new Date().getTime(); 
           ^
TypeError: Cannot set property 'lastCb' of undefined 
at Worker.<anonymous> (/home/anr/Desktop/node js/clustering2.js:56:29) 
at Worker.EventEmitter.emit (events.js:98:17) 
at ChildProcess.EventEmitter.emit (events.js:98:17) 
at handleMessage (child_process.js:318:10) 
at Pipe.channel.onread (child_process.js:345:11) 

這是我的代碼:

var cluster=require('cluster'); 
var os=require('os'); 
var http=require('http'); 
var numCores=os.cpus().length; 

var rsswarn=(50*1024*1024), 
    heapWarn=(50*1024*1024); 
var workers={}; 

if(cluster.isMaster) 
{ 
for(var i=0;i<numCores;i+=1) 
{ 
    createWorker(); 
} 

setInterval(function killWorkers(){ 
    var time=new Date().getTime(); 
    for(pid in workers) 
    { 
     if(workers.hasOwnProperty(pid) && workers[pid].lastCb+5000<time) 
     { 
      console.log('Long running process '+pid+ ' killed'); 
      workers[pid].worker.kill(); 
      delete workers[pid]; 
      createWorker(); 
     } 
    } 
    },1000); 
} 

else 
{ 
    http.Server(function makeServer(req,res){ 
if (Math.floor(Math.random() * 200) === 4) { 
    console.log('Stopped ' + process.pid + ' from ever finishing'); 
    while(true) { continue; } 
} 
res.writeHead(200); 
res.end('hello world from ' + process.pid + '\n'); 
}).listen(8000); 
//Report stats once a second 
setInterval(function report(){ 
process.send({cmd: "reportMem", memory: process.memoryUsage(), process: process.pid}); 
}, 1000); 
} 

    function createWorker() 
{ 
    var worker=cluster.fork(); 
    console.log('created worker: '+worker.pid); 
    workers[worker.pid]={worker:worker,lastCb:(new Date().getTime()-1000)}; 
    worker.on('message',function(m){ 
    if(m.cmd==='reportMem') 
    { 
     workers[m.process].lastCb=new Date().getTime(); 
     if(m.memory.rss>rssWarn) 
     { 
      console.log('worker thread '+m.process+' taking too much memory'); 
     } 
    } 
}); 
} 

回答

1

您會在worker.process.pid找到該pid。這個例子有一個錯字,或者node.js的更新版本已經改變了。

// This works: 
console.log('created worker: ' + worker.process.pid); 

參考:worker.processChildProcess.pid

改變畢竟worker.pidworker.process.pid你還會發現有與可變rsswarn一個錯字這就是後來被稱爲rssWarn

固定這兩件事情之後,你的代碼應該工作。

玩得開心!

+0

發現它,使用應該解釋錯誤的'worker.pid'添加元素,我也注意到在創建服務器時我忘記了將任何參數傳遞給回調函數。 – vamsiampolu

+1

如果您正在使用Linux,請嘗試使用名爲「htop」的工具。然後使用F4過濾「節點」進程。 – Zec