gpt4 book ai didi

python - Tornado ioloop 和 Tornado 的工作流程是什么?

转载 作者:IT老高 更新时间:2023-10-28 22:15:44 26 4
gpt4 key购买 nike

我想知道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 一起工作?

有没有流程图,我看清楚了吗?

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

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

最佳答案

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

  • 这里的 _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

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

关于python - Tornado ioloop 和 Tornado 的工作流程是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7072701/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com