三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 264|回复: 0
打印 上一主题 下一主题

child.send(message[, sendHandle])

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-8-8 08:24:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
child.send(message[, sendHandle])
  • message {Object}
  • sendHandle {Handle object}
使用 child_process.fork() 的时候,你能用 child.send(message, [sendHandle]) 给子进程写数据,子进程通过 'message' 接收消息。
例如:
  1. var cp = require('child_process');

  2. var n = cp.fork(__dirname + '/sub.js');

  3. n.on('message', function(m) {
  4. console.log('PARENT got message:', m);
  5. });

  6. n.send({ hello: 'world' });
复制代码
子进程的代码 'sub.js' :
  1. process.on('message', function(m) {
  2. console.log('CHILD got message:', m);
  3. });

  4. process.send({ foo: 'bar' });
复制代码
子进程代码里的 process 对象拥有 send() 方法,当它通过信道接收到信息时会触发,并返回对象。
注意,父进程和子进程 send() 是同步的,不要用来发送大块的数据(可以用管道来代替,参见child_process.spawn)。
不过发送 {cmd: 'NODE_foo'} 消息是特殊情况。所有包含 NODE_ 前缀的消息都不会被触发,因为它们是 node 的内部的核心消息,它们会在 internalMessage 事件里触发,尽量避免使用这个特性。
child.send() 里的 sendHandle 属性用来发送 TCP 服务或 socket 对象给其他的进程,子进程会用接收到的对象作为 message 事件的第二个参数。
如果不能发出消息会触发 'error' 事件,比如子进程已经退出。
例子: 发送 server 对象
以下是例子:
  1. var child = require('child_process').fork('child.js');

  2. // Open up the server object and send the handle.
  3. var server = require('net').createServer();
  4. server.on('connection', function (socket) {
  5. socket.end('handled by parent');
  6. });
  7. server.listen(1337, function() {
  8. child.send('server', server);
  9. });
复制代码
子进程将会收到这个 server 对象:
  1. process.on('message', function(m, server) {
  2. if (m === 'server') {
  3. server.on('connection', function (socket) {
  4. socket.end('handled by child');
  5. });
  6. }
  7. });
复制代码
注意,现在父子进程共享了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']);
  1. // Open up the server and send sockets to child
  2. var server = require('net').createServer();
  3. server.on('connection', function (socket) {

  4. // if this is a VIP
  5. if (socket.remoteAddress === '74.125.127.100') {
  6. special.send('socket', socket);
  7. return;
  8. }
  9. // just the usual dudes
  10. normal.send('socket', socket);
  11. });
  12. server.listen(1337);
复制代码
child.js 代码如下:
  1. process.on('message', function(m, socket) {
  2. if (m === 'socket') {
  3. socket.end('You were handled as a ' + process.argv[2] + ' person');
  4. }
  5. });
复制代码
注意,当 socket 发送给子进程后,如果这个 socket 被销毁,父进程不再跟踪它,相应的 .connections 属性会变为 null。这种情况下,不建议使用 .maxConnections 。

回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-6-27 00:33 , Processed in 0.023275 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表