代码之家  ›  专栏  ›  技术社区  ›  aja

如何在Tornado中将Web套接字连接发送到不同的进程?

  •  0
  • aja  · 技术社区  · 6 年前

    我正在使用Tornado实现带有Web套接字的服务器。我有一些多核CPU,我还想使用其他CPU。所以我想用python multiprocess 模块。我要接受主进程上的连接,并使用其他进程发送数据。我的问题是:

    1. 是否可以在进程之间共享套接字信息?
    2. 最好用一下吗 pickling 或者有其他方法可以使用吗?
    3. 如果我使用 酸洗 它创建的额外的重复文件描述符将影响操作系统可以处理的文件描述符的数量,或者它是进程之间共享的相同文件描述符?

    说明: 会有很多传入的连接,并且会有很多来自客户端的消息,所以我不希望主事件循环在发送数据时被卡住。这就是为什么我尝试使用不同的进程将数据发送到连接。

    Strace输出 我已经开始了 strace 并给出了从中向Web套接字发送数据的进程ID。的输出 斯特雷斯 如下所示:

    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     91.01    0.019570           0    441736           sendto
      3.60    0.000774           0     29314           read
      3.14    0.000675           0     30623           clock_gettime
      1.15    0.000248           0      2909           write
      0.96    0.000206           0     11855           epoll_wait
      0.13    0.000029           0      1534       680 recvfrom
      0.00    0.000000           0        17           open
      0.00    0.000000           0        34           close
      0.00    0.000000           0        17           stat
      0.00    0.000000           0        17           fstat
      0.00    0.000000           0        34           poll
      0.00    0.000000           0        39           mmap
      0.00    0.000000           0        26           munmap
      0.00    0.000000           0       408           brk
      0.00    0.000000           0       134           ioctl
      0.00    0.000000           0        34           socket
      0.00    0.000000           0        34        17 connect
      0.00    0.000000           0       300           setsockopt
      0.00    0.000000           0        17           getsockopt
      0.00    0.000000           0       200           fcntl
      0.00    0.000000           0        17           gettimeofday
      0.00    0.000000           0      1185           epoll_ctl
      0.00    0.000000           0       178        78 accept4
    ------ ----------- ----------- --------- --------- ----------------
    100.00    0.021502                520662       775 total
    

    我犯错误有什么原因吗 recvfrom connect ?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ben Darnell    6 年前

    不,龙卷风不支持这一点。有一些技术 SCM_RIGHTS 将文件描述符传输到其他进程,但这将给您提供另一个进程中的原始套接字,而不是Tornado WebSocket对象(并且没有支持的方法为该套接字构造WebSocket对象)。

    Tornado的推荐方法是每个CPU运行一个进程,并通过将它们放在负载均衡器后面或使用so-reuseport让它们共享流量。在Tornado中发送数据是不阻塞的;您必须确保自己的代码也是不阻塞的(使用异步接口或线程池)。

        2
  •  0
  •   SKi    6 年前

    我将回答第一个问题:

    is it possible to share the socket information between processes?

    可能取决于操作系统,但对于Linux,至少有两种方法:

    • 当主进程接受一个新的TCP连接时,它可以派生一个新的子进程来处理它。在fork之后,新的子进程将具有与主进程相同的套接字文件描述符。

    • 使用Unix域套接字将套接字的文件描述符从主进程传递到另一个进程。这需要使用SCM权限控制消息和辅助数据。检查 this .