2011-08-16 73 views
24

我想知道龙卷风的内部工作流程,并且已经看见this article,这是伟大的事,但我就是不能ioloop.py内找出什么是龙卷风ioloop和龙卷风的工作流程?

,有这样的功能

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时触发一次?

每个套接字连接都会生成一个文件描述符,或者它只生成一次?

ioloop和iostream之间有什么关系?

httpserver如何与ioloop和iostream一起使用?

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

对不起这些questiones,我只是困惑

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

回答

29

我会看看我是否能为了回答您的问题:

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

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

+0

“它们会生成更多的通信套接字”,套接字是linux内部套接字(unix域套接字)? – limboy

+1

@Izyy我相信他们是“互联网套接字”(类型socket.AF_INET在Python中)。维基百科有一些很好的信息。主侦听套接字将只有一个接收地址+端口,但每个新的通信套接字都将具有本地和远程地址+端口,允许它们唯一地应用于每个客户端连接,即使它们在服务器上具有相同的本地地址。虽然我不确定确切的实施细节:)。 – mesilliac

+0

感谢您的解释:) – limboy