【问题标题】:what's the tornado ioloop, and tornado's workflow?龙卷风 ioloop 和龙卷风的工作流程是什么?
【发布时间】:2011-10-27 17:06:23
【问题描述】:

我想知道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 还是只在初始化时触发一次?

每个socket连接都会生成一个文件描述符,还是只生成一次?

ioloop 和 iostream 之间有什么关系?

httpserver 如何与 ioloop 和 iostream 一起工作?

有没有流程图,让我看清楚?

抱歉这些问题,我只是困惑

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

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    我看看能不能按顺序回答你的问题:

    • 这里的_impl 是可用的套接字轮询机制,epoll 在 Linux 上,select 在 Windows 上。所以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

    我希望这能回答您的一些问题。我不知道一个好的结构图,但总体思路对于其他网络服务器也应该非常相似,所以可能有一些很好的信息。你链接到的那篇深入的文章看起来确实很有用,所以如果你足够理解,我建议你再试一次:)。

    【讨论】:

    • “它们会生成更多的通信套接字”,这些套接字是 linux 内部套接字(unix 域套接字)吗?
    • @Izyy 我相信它们是“互联网套接字”(python 中的 socket.AF_INET 类型)。维基百科有一些很好的信息。主监听套接字将只有一个接收地址+端口,但每个新的通信套接字将同时具有本地和远程地址+端口,允许它们唯一地应用于每个客户端连接,即使它们在服务器上具有相同的本地地址.不过,我不确定确切的实施细节:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多