zoukankan      html  css  js  c++  java
  • node 父子进程传递对象

    背景

    node的父子进程中可以传递这是肯定的,但是传递对象,这是一个稀奇的地方。

    code

    发送 server 对象

    
    sendHandle 参数可用于将一个 TCP server 对象句柄传给子进程,如下所示:
    const subprocess = require('child_process').fork('subprocess.js');
    
    // 开启 server 对象,并发送该句柄。
    const server = require('net').createServer();
    server.on('connection', (socket) => {
      socket.end('被父进程处理');
    });
    server.listen(1337, () => {
      subprocess.send('server', server);
    });
    
    子进程接收 server 对象如下:
    process.on('message', (m, server) => {
      if (m === 'server') {
        server.on('connection', (socket) => {
          socket.end('被子进程处理');
        });
      }
    });
    

    当服务器在父进程和子进程之间是共享的,则一些连接可被父进程处理,另一些可被子进程处理。

    上面的例子使用了一个 net 模块创建的服务器,而 dgram 模块的服务器使用完全相同的工作流程,但它监听一个 'message' 事件而不是 'connection' 事件,且使用 server.bind 而不是 server.listen()。 目前仅 UNIX 平台支持这一点。

    传递socket

    例子:发送 socket 对象

    同样,sendHandle 参数可用于将一个 socket 句柄传给子进程。 以下例子衍生了两个子进程,分别用于处理 "normal" 连接或优先处理 "special" 连接:

    const { fork } = require('child_process');
    const normal = fork('subprocess.js', ['normal']);
    const special = fork('subprocess.js', ['special']);
    
    // 开启 server,并发送 socket 给子进程。
    // 使用 `pauseOnConnect` 防止 socket 在被发送到子进程之前被读取。
    const server = require('net').createServer({ pauseOnConnect: true });
    server.on('connection', (socket) => {
    
      // 特殊优先级。
      if (socket.remoteAddress === '74.125.127.100') {
        special.send('socket', socket);
        return;
      }
      // 普通优先级。
      normal.send('socket', socket);
    });
    server.listen(1337);
    
    subprocess.js 会接收到一个 socket 句柄,并作为第二个参数传给事件回调函数:
    
    process.on('message', (m, socket) => {
      if (m === 'socket') {
        if (socket) {
          // 检查客户端 socket 是否存在。
          // socket 在被发送与被子进程接收这段时间内可被关闭。
          socket.end(`请求被 ${process.argv[2]} 优先级处理`);
        }
      }
    });
    

    一旦一个 socket 已被传给了子进程,则父进程不再能够跟踪 socket 何时被销毁。 为了表明这个,.connections 属性会变成 null。 当发生这种情况时,建议不要使用 .maxConnections。

    建议在子进程中的任何 message 处理程序都需要验证 socket 是否存在,因为连接可能会在它在发送给子进程的这段时间内被关闭。

  • 相关阅读:
    剑指offer_11:二进制中1的个数
    剑指offer_10:矩形覆盖
    spring mvc 访问静态资源
    spring context:component-scan ex
    spring aop配置未生效
    415 Unsupported Media Type
    spring mvc 接收List对象入参
    JIRA甘特图
    JIRA的工时
    JIRA导出工作日志到Excel
  • 原文地址:https://www.cnblogs.com/aoximin/p/13201040.html
Copyright © 2011-2022 走看看