Created
November 23, 2010 21:15
-
-
Save aikar/712548 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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