Skip to content

Instantly share code, notes, and snippets.

@aikar
Created November 23, 2010 21:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aikar/712548 to your computer and use it in GitHub Desktop.
Save aikar/712548 to your computer and use it in GitHub Desktop.
var fork = require('fork').fork;
var netBinding = process.binding('net');
var net = require('net');
var ppid = process.pid;
var workers = [];
function preforkServer(port, numWorkers, clientServer)
{
var srv = 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(i)
{
var fds = netBinding.socketpair();
var pid = fork();
console.log('worker with pid ' + pid + ' spawned on i ' + i + ' from ' + process.pid);
if(pid == 0)
{
var sr = new net.Stream(fds[0], 'unix');
sr.resume();
sr.on('end',function(){
var index = workers.indexOf(sr);
if(index >= 0)
{
workers.splice(index, 1);
}
});
workers.push(sr);
return true;
}else{
var cl = new net.Stream(fds[1], 'unix');
cl.resume();
cl.on('fd', function(fd)
{
var client = new net.Stream(fd, 'unix');
client.type = clientServer.type;
client.server = clientServer;
client.resume();
clientServer.emit('connection', x);
})
cl.on('data', function(data){
console.log('[client]', data);
});
return false;
}
}
var i = 0;
do
{
console.log('----------------');
var ret = spawnWorker(i)
console.log("ret from i " + i + " was ", ret);
}while(ret && i++ < numWorkers);
}
var srv = require('http').createServer(function(req, resp) {
resp.writeHead(200, {'Content-Type' : 'text/plain'});
resp.write(ppid + ' (pid ' +pid + ')\n');
resp.end();
});
preforkServer(8124, 8, srv);
//process.openStdin();
results to stdout:
>>> node fork.js
----------------
worker with pid 0 spawned on i 0 from 6866
ret from i 0 was true
----------------
worker with pid 6867 spawned on i 0 from 6866
ret from i 0 was false
worker with pid 0 spawned on i 1 from 6866
worker with pid 6868 spawned on i 1 from 6866
ret from i 1 was true
----------------
ret from i 1 was false
worker with pid 0 spawned on i 2 from 6866
ret from i 2 was true
----------------
worker with pid 0 spawned on i 3 from 6866
worker with pid 6870 spawned on i 3 from 6866
ret from i 3 was false
worker with pid 6869 spawned on i 2 from 6866
ret from i 2 was false
ret from i 3 was true
----------------
worker with pid 0 spawned on i 4 from 6866
ret from i 4 was true
----------------
worker with pid 0 spawned on i 5 from 6866
ret from i 5 was true
----------------
worker with pid 0 spawned on i 6 from 6866
ret from i 6 was true
----------------
worker with pid 6871 spawned on i 4 from 6866
ret from i 4 was false
worker with pid 0 spawned on i 7 from 6866
worker with pid 6872 spawned on i 5 from 6866
ret from i 7 was true
----------------
ret from i 5 was false
worker with pid 6873 spawned on i 6 from 6866
worker with pid 0 spawned on i 8 from 6866
ret from i 6 was false
ret from i 8 was true
worker with pid 6874 spawned on i 7 from 6866
ret from i 7 was false
worker with pid 6875 spawned on i 8 from 6866
ret from i 8 was false
process tree:
>>> psf node
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 6709 1.0 0.2 645864 8964 pts/0 S+ 16:09 0:00 | \_ node fork.js
root 6710 0.1 0.1 645864 6268 pts/0 S+ 16:09 0:00 | \_ node fork.js
root 6711 0.1 0.1 645864 5424 pts/0 S+ 16:09 0:00 | \_ node fork.js
root 6712 0.0 0.1 645864 5376 pts/0 S+ 16:09 0:00 | \_ node fork.js
root 6713 0.0 0.1 645864 5376 pts/0 S+ 16:09 0:00 | \_ node fork.js
root 6714 0.1 0.1 645864 5376 pts/0 S+ 16:09 0:00 | \_ node fork.js
root 6715 0.0 0.1 645864 5376 pts/0 S+ 16:09 0:00 | \_ node fork.js
root 6716 0.0 0.1 645864 5384 pts/0 S+ 16:09 0:00 | \_ node fork.js
root 6717 0.0 0.1 645864 5384 pts/0 S+ 16:09 0:00 | \_ node fork.js
root 6718 0.0 0.1 645864 5328 pts/0 S+ 16:09 0:00 | \_ node fork.js
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment