我想知道龙卷风的内部工作流程,并且已经看过this article,这很棒,但我无法弄清楚
在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时触发一次?
每个socket连接都会生成一个文件描述符,或者它只生成一次?
ioloop和iostream之间的关系是什么?
httpserver如何与ioloop和iostream一起使用?
是否有任何工作流程图,所以我可以清楚地看到它?
对不起这些问题,我只是感到困惑
任何链接,建议,提示都有帮助。非常感谢:))
答案 0 :(得分:30)
我会看看我是否可以按顺序回答你的问题:
此处_impl
是可用的套接字轮询机制,Linux上为epoll
,Windows上为select
。因此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
。
我希望这能回答你的一些问题。我不知道一个好的结构图,但总体思路也应该与其他网络服务器相当类似,所以可能会有一些好的信息。你链接到的这篇深度文章看起来非常有用,所以如果你理解得足够多,我建议再给它一次:)。