什么是龙卷风ioloop和龙卷风的工作流程?

时间:2011-08-16 01:37:18

标签: python tornado

我想知道龙卷风的内部工作流程,并且已经看过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一起使用?

是否有任何工作流程图,所以我可以清楚地看到它?

对不起这些问题,我只是感到困惑

任何链接,建议,提示都有帮助。非常感谢:))

1 个答案:

答案 0 :(得分:30)

我会看看我是否可以按顺序回答你的问题:

  • 此处_impl是可用的套接字轮询机制,Linux上为epoll,Windows上为select。因此self._impl.register(fd, events | self.ERROR)将“等待某个事件”请求传递给底层操作系统,特别是包括错误事件。

    运行时,HTTPServer将使用IOLoop.add_handler()注册套接字以接受连接。当接受连接时,它们将生成更多通信套接字,这可能还会通过IOStream添加事件处理程序,这也可能会调用add_handler()。因此,新的处理程序将在开始时添加,并在接收连接时添加。

  • 是的,每个新的套接字连接都有一个唯一的文件描述符。 HTTPServer正在侦听的原始套接字应保留其文件描述符。文件描述符由操作系统提供。

  • IOLoop处理与套接字有关的事件,例如它们是否有可读取的数据,是否可以写入,以及是否发生了错误。通过使用epollselect等操作系统服务,它可以非常有效地执行此操作。

    IOStream通过单个连接处理流数据,并使用IOLoop异步执行此操作。例如,IOStream可以读取尽可能多的数据,然后使用IOLoop.add_handler()等待更多数据可用。

  • listen()上,HTTPServer创建一个套接字,用于使用IOLoop侦听连接。获得连接后,它使用socket.accept()创建一个新套接字,然后使用新的HTTPConnection与客户端进行通信。

    HTTPConnection使用IOStream向客户端传输数据或从客户端传输数据。此IOStream使用IOLoop以异步和非阻塞方式执行此操作。许多IOStreamHTTPConnection个对象可以同时处于活动状态,所有对象都使用相同的IOLoop

我希望这能回答你的一些问题。我不知道一个好的结构图,但总体思路也应该与其他网络服务器相当类似,所以可能会有一些好的信息。你链接到的这篇深度文章看起来非常有用,所以如果你理解得足够多,我建议再给它一次:)。