鍍金池/ 問答/HTML/ 多進程,server關閉之后,再次fork進程,出錯,句柄應該如何傳遞

多進程,server關閉之后,再次fork進程,出錯,句柄應該如何傳遞

  1. 我模仿普靈書中提交的多進程操作,在server關閉之后,再次fork進程,場景是:子進程掛掉之后,通知父進程重新創(chuàng)建一個,這時server已經(jīng)關閉,導致一場
  2. 代碼如下
master代碼
var fork = require('child_process').fork;
var cpus = require('os').cpus();
var server = require('net').createServer();
server.listen(1337);
var workers = {};
var createWorker = function () {
  var worker = fork(__dirname + '/worker.js');
  // 退出時重新啟動新的進程
  worker.on('message', function (message) {
    if (message.act === 'suicide') {
      createWorker();
    }
  });
  worker.on('exit', function () {
    console.log('Worker ' + worker.pid + ' exited.');
    delete workers[worker.pid];
  });
  worker.send('server', server);
  workers[worker.pid] = worker;
  console.log('Create worker. pid: ' + worker.pid);
};
for (var i = 0; i < cpus.length; i++) {
  createWorker();
}
server.close();
process.on('exit', function () {
  for (var pid in workers) {
    workers[pid].kill();
  }
});
worker 代碼
var http = require('http');
var server = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('handled by child, pid is ' + process.pid + '\n');
  throw new Error('throw exception');
});
var worker;
process.on('message', function (m, tcp) {
  if (m === 'server') {
    worker = tcp;
    worker.on('connection', function (socket) {
      server.emit('connection', socket);
    });
  }
});
process.on('uncaughtException', function (err) {
  process.send({act: 'suicide'});
  // 停止接收新的連接
  worker.close(function () {
    // 所有已有連接斷開后,退出進程
    process.exit(1);
  });
});

3.報錯如下
net.js:1706

if (handle._simultaneousAccepts !== simultaneousAccepts) {
           ^

TypeError: Cannot read property '_simultaneousAccepts' of null

at Object._setSimultaneousAccepts (net.js:1706:16)
at ChildProcess.target._send (internal/child_process.js:657:13)
at ChildProcess.target.send (internal/child_process.js:586:19)
at createWorker (D:\projects\diveintonode_examples-master\09\suicide\master.js:20:10)
at ChildProcess.<anonymous> (D:\projects\diveintonode_examples-master\09\suicide\master.js:13:7)
at emitTwo (events.js:126:13)
at ChildProcess.emit (events.js:214:7)
at emit (internal/child_process.js:772:12)
at _combinedTickCallback (internal/process/next_tick.js:141:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
回答
編輯回答
哚蕾咪

在Master主進程里面捕獲一下即可,否則會使得整個程序奔潰:
process.on('uncaughtException', function (err) {

console.log(`Master uncaughtException:\r\n`);
console.log(err);

});

2017年1月29日 07:51