Python tornado iLoop是什么?tornado的工作流程是什么?

Python tornado iLoop是什么?tornado的工作流程是什么?,python,tornado,Python,Tornado,我想知道tornado的内部工作流程,我已经看到了,这很好,但有些事情我就是搞不清楚 在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 |

我想知道tornado的内部工作流程,我已经看到了,这很好,但有些事情我就是搞不清楚

在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_处理程序,或者在初始化时只触发一次

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

ioloop和iostream之间有什么关系

httpserver如何与ioloop和iostream一起工作

是否有工作流程图,以便我能清楚地看到

抱歉这些问题,我只是搞糊涂了


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

我会看看能否按顺序回答您的问题:

这里_impl是可用的套接字轮询机制,在Linux上是epoll,在Windows上是select。因此self._impl.registerfd,events | self.ERROR将等待某个事件请求传递给底层操作系统,也特别包括错误事件


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

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

IOLoop处理与套接字有关的事件,例如它们是否有可读取的数据、是否可以写入数据以及是否发生了错误。通过使用操作系统服务,如epoll或select,它可以非常高效地完成这项工作

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

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

HTTPConnection使用IOStream向客户端或从客户端传输数据。IOStream使用IOLoop以异步和非阻塞的方式完成这项工作。许多IOStream和HTTPConnection对象可以同时处于活动状态,它们都使用相同的IOLoop


我希望这能回答你的一些问题。我不知道有什么好的结构图,但对于其他Web服务器来说,总体思路也应该相当类似,因此可能会有一些好的信息。你链接到的那篇深入的文章看起来确实很有用,因此如果你理解得足够多,我建议你再试试:。

它们会生成更多的通信套接字,这些套接字是linux内部套接字还是unix域套接字?@Izyy我相信它们是python中socket.AF_INET类型的internet套接字。维基百科有一些很好的信息。主侦听套接字只有一个接收地址+端口,但每个新的通信套接字都有一个本地和远程地址+端口,允许它们唯一地应用于每个客户端连接,即使它们在服务器上具有相同的本地地址。但我不确定具体的实现细节:。