Tornado http服务器的bind方法

发布于 2024-11-29 21:49:06 字数 488 浏览 1 评论 0原文

在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) 

表示当一个socket连接时,触发ioloop.IOLoop.READ event ,调用 self._handle_events ,对吗?

但每个客户端都会生成一个新的文件描述符,对吗?

那么ioloop如何通过sock.fileno()来监控客户端的socket连接呢? (httpserver的bind方法只调用一次)

In httpserver.py, there is a bind method, at the end of this method is the code like this:

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) 

It means when a socket connected, and trigger ioloop.IOLoop.READ event , call self._handle_events, right?

But every client will generate a new file descriptor, right?

So how ioloop monitor client's socket connect via sock.fileno()? (httpserver's bind method only called once)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我不吻晚风 2024-12-06 21:49:06

我只是快速浏览了一下源代码,它似乎是这样工作的:

Tornado 本身并不监视套接字,它使用 epoll (Linux) 或 <代码>选择。对 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 对象。

I just had a quick look at the source, and it seems to work like this:

Tornado doesn't monitor the sockets itself, it passes this job onto the operating system, using epoll (Linux) or select. The call to self.io_loop.add_handler just adds a callback for when a new connection is available.

Client connections are set up by self._handle_events, which creates a new HTTPConnection for each new connection recieved by the socket. The communication socket used by each HTTPConnection is a new socket created by calling sock.accept(). The server continues accepting connections on the same socket as before.

so in summary:

  • Yes, the io_loop calls self._handle_events when a new connection is detected on the socket.
  • No, the socket is reused for new connections. In stead a new HTTPConnection object is created for each client, with a separate socket for communication.
  • The io_loop doesn't need to actively monitor the socket. It passes the duty to the operating system using epoll or select. The actual communication with the clients is done by the HTTPConnection objects.

I think the key thing to understand, is that the socket here is just used for accepting new connections. When a connection is accepted using sock.accept(), this returns a new socket for communication, which is then attached to a HTTPConnection object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文