我想知道龙卷风的内部工作流程,看过这篇文章,它很棒,但是我无法弄清楚
在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)
Run Code Online (Sandbox Code Playgroud)
这是什么意思?每个请求都会触发add_handler,或者只是在init时触发一次?
每个socket连接都会生成一个文件描述符,或者它只生成一次?
ioloop和iostream之间的关系是什么?
httpserver如何与ioloop和iostream一起使用?
是否有任何工作流程图,所以我可以清楚地看到它?
对不起这些问题,我只是感到困惑
任何链接,建议,提示有帮助.非常感谢 :)
mes*_*iac 30
我会看看我是否可以按顺序回答你的问题:
以下_impl是epollLinux select上的Windows 上可用的套接字轮询机制.因此self._impl.register(fd, events | self.ERROR)将"等待某个事件"请求传递给底层操作系统,特别是包括错误事件.
运行时,HTTPServer将注册套接字以接受连接,使用IOLoop.add_handler().当接受连接时,它们将生成更多通信套接字,这也可能通过一个IOStream也可以调用的事件处理程序来添加add_handler().因此,新的处理程序将在开始时添加,并且随着连接的接收.
是的,每个新的套接字连接都有一个唯一的文件描述符.HTTPServer正在侦听的原始套接字应保留其文件描述符.文件描述符由操作系统提供.
在IOLoop处理事件与插座的事,比如他们是否有可用的数据被读取,它们是否可以写入,以及是否有错误已发生.通过使用诸如epoll或之类的操作系统服务select,它可以非常有效地执行此操作.
一个IOStream通过单一连接处理流数据,并使用IOLoop异步做到这一点.例如,IOStream可以读取尽可能多的数据,然后使用IOLoop.add_handler()等待更多数据可用.
在listen(),HTTPServer创建一个套接字,它用它来监听连接IOLoop.当获得连接时,它用于socket.accept()创建新套接字,然后使用新套接字与客户端进行通信HTTPConnection.
在HTTPConnection使用一个IOStream将数据传输到或者从客户端.这IOStream使用IOLoop以异步和非阻塞方式执行此操作.许多IOStream和HTTPConnection对象可以一次激活,都使用相同的IOLoop.
我希望这能回答你的一些问题.我不知道一个好的结构图,但总体思路也应该与其他网络服务器相当类似,所以可能会有一些好的信息.你链接到的这篇深度文章看起来非常有用,所以如果你理解得足够多,我建议再给它一次:).