我正在使用龙卷风通过Web套接字实现服务器。我有一些多核CPU,我也想使用其他CPU。因此,尽管我使用python multiprocess
模块。我想接受主进程上的连接,并使用其他进程发送数据。我的问题是:
pickling
更好还是可以使用其他方法?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
我是否有任何错误消息recvfrom
和connect
?
答案 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。