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

时间:2018-07-23 10:19:15

标签: sockets multiprocessing tornado python-3.6 pickle

我正在使用龙卷风通过Web套接字实现服务器。我有一些多核CPU,我也想使用其他CPU。因此,尽管我使用python multiprocess模块。我想接受主进程上的连接,并使用其他进程发送数据。我的问题是:

  1. 是否可以在进程之间共享套接字信息?
  2. 使用pickling更好还是可以使用其他方法?
  3. 如果我使用pickling,由它创建的其他重复文件描述符将影响OS可以处理的文件描述符数量,或者是进程之间共享的同一文件描述符?

说明: 将会有很多传入连接,并且会有来自客户端的大量消息,因此我不想让主事件循环陷入发送数据的麻烦。这就是为什么我尝试使用不同的过程将数据发送到连接的原因。

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

% 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

我是否有任何错误消息recvfromconnect

2 个答案:

答案 0 :(得分:1)

不,Tornado不支持此功能。有类似SCM_RIGHTS的技术可以将文件描述符传输到其他进程,但这将为您在其他进程中提供一个原始套接字,而不是Tornado websocket对象(并且不支持为该套接字构造websocket对象的方法) )。

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

答案 1 :(得分:0)

我将回答第一个问题:

is it possible to share the socket information between processes?

可能取决于操作系统,但使用Linux至少可以通过以下两种方式:

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

  • 使用UNIX域套接字将套接字的文件描述符从主进程传递到另一个进程。这需要使用SCM_RIGHTS控制消息和辅助数据。选中this