child.send(message[, sendHandle])- message {Object}
- sendHandle {Handle object}
使用 child_process.fork() 的时候,你能用 child.send(message, [sendHandle]) 给子进程写数据,子进程通过 'message' 接收消息。 例如: - var cp = require('child_process');
- var n = cp.fork(__dirname + '/sub.js');
- n.on('message', function(m) {
- console.log('PARENT got message:', m);
- });
- n.send({ hello: 'world' });
复制代码子进程的代码 'sub.js' : - process.on('message', function(m) {
- console.log('CHILD got message:', m);
- });
- process.send({ foo: 'bar' });
复制代码子进程代码里的 process 对象拥有 send() 方法,当它通过信道接收到信息时会触发,并返回对象。 不过发送 {cmd: 'NODE_foo'} 消息是特殊情况。所有包含 NODE_ 前缀的消息都不会被触发,因为它们是 node 的内部的核心消息,它们会在 internalMessage 事件里触发,尽量避免使用这个特性。 child.send() 里的 sendHandle 属性用来发送 TCP 服务或 socket 对象给其他的进程,子进程会用接收到的对象作为 message 事件的第二个参数。 如果不能发出消息会触发 'error' 事件,比如子进程已经退出。 例子: 发送 server 对象以下是例子: - var child = require('child_process').fork('child.js');
- // Open up the server object and send the handle.
- var server = require('net').createServer();
- server.on('connection', function (socket) {
- socket.end('handled by parent');
- });
- server.listen(1337, function() {
- child.send('server', server);
- });
复制代码子进程将会收到这个 server 对象: - process.on('message', function(m, server) {
- if (m === 'server') {
- server.on('connection', function (socket) {
- socket.end('handled by child');
- });
- }
- });
复制代码注意,现在父子进程共享了server,某些连接会被父进程处理,某些会被子进程处理。 dgram 服务器,工作流程是一样的,监听的是 message 事件,而不是 connection,使用 server.bind 而不是 server.listen。(目前仅支持 UNIX 平台) 例子: 发送 socket 对象以下是发送 socket 对象的例子。 他将会创建 2 个子线程,并且同时处理连接,一个将远程地址 74.125.127.100 当做 VIP 发送到一个特殊的子进程,另外一个发送到正常进程。var normal = require('child_process').fork('child.js', ['normal']);var special = require('child_process').fork('child.js', ['special']); - // Open up the server and send sockets to child
- var server = require('net').createServer();
- server.on('connection', function (socket) {
- // if this is a VIP
- if (socket.remoteAddress === '74.125.127.100') {
- special.send('socket', socket);
- return;
- }
- // just the usual dudes
- normal.send('socket', socket);
- });
- server.listen(1337);
复制代码child.js 代码如下: - process.on('message', function(m, socket) {
- if (m === 'socket') {
- socket.end('You were handled as a ' + process.argv[2] + ' person');
- }
- });
复制代码注意,当 socket 发送给子进程后,如果这个 socket 被销毁,父进程不再跟踪它,相应的 .connections 属性会变为 null。这种情况下,不建议使用 .maxConnections 。
|