Skip to content

Instantly share code, notes, and snippets.

@aikar
Created November 23, 2010 22:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aikar/712628 to your computer and use it in GitHub Desktop.
Save aikar/712628 to your computer and use it in GitHub Desktop.
Preforking TCP Server to take advantage of multiple CPU cores
(function(){
var fork = require('fork').fork;
var netBinding = process.binding('net');
var net = require('net');
var workers = [];
module.exports = preforkServer = function(port, numWorkers, clientServer)
{
net.createServer(function(s) {
s.pause();
var hv = 0;
s.remoteAddress.split('.').forEach(function(v) {
hv += parseInt(v);
});
var i = hv % workers.length;
workers[i].write('test', 'utf8', s.fd);
}).listen(port);
var spawnWorker = function()
{
var fds = netBinding.socketpair();
var pid = fork();
if(pid)
{
process.pid = pid;
var master = new net.Stream(fds[0], 'unix');
master.resume();
master.on('end',function(){
var index = workers.indexOf(master);
if(index >= 0)
{
workers.splice(index, 1);
}
setTimeout(spawnWorker, 1000);
});
workers.push(master);
return true;
}else{
var child = new net.Stream(fds[1], 'unix');
child.resume();
child.on('fd', function(fd)
{
var client = new net.Stream(fd, 'unix');
client.type = clientServer.type;
client.server = clientServer;
client.resume();
clientServer.emit('connection', client);
});
return false;
}
}
var i = 1;
do
{
var ret = spawnWorker(i)
}while(ret && i++ < numWorkers);
};
})();
(function(){
var preforkServer = require('preforkserver');
preforkServer(8124, 8, require('http').createServer(function(req, resp) {
resp.writeHead(200, {
'Content-Type' : 'text/plain'
});
resp.write('(pid ' + process.pid + ')\n');
resp.end();
}));
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment