在httpserver.py中,有一个bind
方法,在这个方法的最后是这样的代码:
sock.bind(sockaddr)
sock.listen(128)
self._sockets[sock.fileno()] = sock
if self._started:
self.io_loop.add_handler(sock.fileno(), self._handle_events,
ioloop.IOLoop.READ)
这意味着当套接字连接并触发ioloop.IOLoop.READ
事件时,请致电self._handle_events
,对吧?
但是每个客户端都会生成一个新的文件描述符,对吗?
那么ioloop如何通过sock.fileno()
监控客户端的套接字连接? (httpserver的bind方法只调用一次)
答案 0 :(得分:0)
我只是快速浏览一下来源,它看起来像这样:
Tornado不监视套接字本身,它使用epoll
(Linux)或select
将此作业传递到操作系统。对self.io_loop.add_handler
的调用只会在新连接可用时添加回调。
客户端连接由self._handle_events
设置,为套接字收到的每个新连接创建一个新的HTTPConnection
。每个HTTPConnection
使用的通信套接字是通过调用sock.accept()
创建的新套接字。服务器继续接受与以前相同的套接字上的连接。
总结如下:
self._handle_events
。HTTPConnection
对象,并使用一个单独的套接字进行通信。epoll
或select
将职责交给操作系统。与客户端的实际通信由HTTPConnection
对象完成。我认为要理解的关键是,这里的套接字仅用于接受新连接。使用sock.accept()
接受连接时,将返回一个用于通信的新套接字,然后将其附加到HTTPConnection
对象。