Tornado http服务器的绑定方法

时间:2011-08-16 03:25:31

标签: python tornado

在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方法只调用一次)

1 个答案:

答案 0 :(得分:0)

我只是快速浏览一下来源,它看起来像这样:

Tornado不监视套接字本身,它使用epoll(Linux)或select将此作业传递到操作系统。对self.io_loop.add_handler的调用只会在新连接可用时添加回调。

客户端连接由self._handle_events设置,为套接字收到的每个新连接创建一个新的HTTPConnection。每个HTTPConnection使用的通信套接字是通过调用sock.accept()创建的新套接字。服务器继续接受与以前相同的套接字上的连接。

总结如下:

  • 是的,当套接字上检测到新连接时,io_loop会调用self._handle_events
  • 不,套接字会重新用于新连接。而是为每个客户端创建一个新的HTTPConnection对象,并使用一个单独的套接字进行通信。
  • io_loop不需要主动监视套接字。它使用epollselect将职责交给操作系统。与客户端的实际通信由HTTPConnection对象完成。

我认为要理解的关键是,这里的套接字仅用于接受新连接。使用sock.accept()接受连接时,将返回一个用于通信的新套接字,然后将其附加到HTTPConnection对象。