我想了解tornado的内部工作流程,并且已经看到本文 http://golubenco.org/?p=16,这很棒,但我就是不明白
在ioloop.py中,有这样一个函数
def add_handler(self, fd, handler, events):
"""Registers the given handler to receive the given events for fd."""
self._handlers[fd] = handler
self._impl.register(fd, events | self.ERROR)
那么这是什么意思呢?每个请求都会触发add_handler还是在init时只触发一次?
每个套接字连接都会生成一个文件描述符,或者只生成一次?
ioloop 和 iostream 之间有什么关系?
httpserver 如何与 ioloop 和 iostream 一起使用?
有没有工作流程图,方便我看清楚?
抱歉这些问题,我只是很困惑
任何链接、建议、提示都有帮助。非常感谢 :)
我看看能否按顺序回答你的问题:
-
Here _impl
是可用的套接字轮询机制,epoll
在Linux上,select
在 Windows 上。所以self._impl.register(fd, events | self.ERROR)
将“等待某些事件”请求传递给底层操作系统,还特别包括错误事件。
运行时,HTTPServer
将注册套接字以接受连接,使用IOLoop.add_handler()
。当连接被接受时,它们将生成更多的通信套接字,这也可能通过以下方式添加事件处理程序:IOStream
,也可以调用add_handler()
。因此,新的处理程序将在开始时和收到连接时添加。
是的,每个新的套接字连接都会有一个唯一的文件描述符。原来的插座HTTPServer
正在监听的应该保留其文件描述符。文件描述符由操作系统提供。
-
The IOLoop
处理与套接字有关的事件,例如是否有数据可供读取、是否可以写入以及是否发生错误。通过使用操作系统服务,例如epoll
or select
,它可以非常有效地做到这一点。
An IOStream
通过单个连接处理流数据,并使用IOLoop
异步执行此操作。例如一个IOStream
可以读取尽可能多的可用数据,然后使用IOLoop.add_handler()
等待更多数据可用。
-
On listen()
, the HTTPServer
创建一个套接字,用于监听连接IOLoop
。当获得连接时,它使用socket.accept()
创建一个新的套接字,然后使用新的套接字与客户端进行通信HTTPConnection
.
The HTTPConnection
使用一个IOStream
向客户端传输数据或从客户端传输数据。这IOStream
使用IOLoop
以异步和非阻塞的方式做到这一点。许多IOStream
and HTTPConnection
对象可以同时处于活动状态,所有对象都使用相同的IOLoop
.
我希望这能回答您的一些问题。我不知道有什么好的结构图,但其他网络服务器的总体思路也应该非常相似,所以可能有一些好的信息。您链接到的那篇深入文章看起来确实非常有用,所以如果您足够理解,我建议您再试一次:)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)