簡體   English   中英

龍卷風 ioloop 和龍卷風的工作流程是什么?

[英]what's the tornado ioloop, and tornado's workflow?

我想知道龍卷風的內部工作流程,並且看過這篇文章,很好,但我就是想不通

在ioloop.py里面,有這樣一個function

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 或者它只是在初始化時觸發一次?

每個套接字連接都會生成一個文件描述符,還是只生成一次?

ioloop和iostream有什么關系?

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

有沒有流程圖,讓我看清楚?

對不起這些問題,我只是困惑

任何鏈接、建議、提示都有幫助。 非常感謝:)

我看看能不能按順序回答你的問題:

  • 這里_impl是可用的任何套接字輪詢機制,Linux 上的epollselect上的 select。 所以self._impl.register(fd, events | self.ERROR)將“等待某個事件”請求傳遞給底層操作系統,也特別包括錯誤事件。

    運行時, HTTPServer將使用IOLoop.add_handler()注冊 sockets 以接受連接。 當連接被接受時,它們將產生更多的通信 sockets,這可能還會通過IOStream添加事件處理程序,它也可能調用add_handler() 因此,將在開始時添加新的處理程序,並在收到連接時添加。

  • 是的,每個新的套接字連接都會有一個唯一的文件描述符。 HTTPServer正在偵聽的原始套接字應該保留其文件描述符。 文件描述符由操作系統提供。

  • IOLoop處理與 sockets 相關的事件,例如它們是否有數據可供讀取、是否可以寫入以及是否發生錯誤。 通過使用諸如epollselect之類的操作系統服務,它可以非常有效地做到這一點。

    IOStream通過單個連接處理流數據,並使用IOLoop異步執行此操作。 例如,一個IOStream可以讀取盡可能多的數據,然后使用IOLoop.add_handler()等待更多數據可用。

  • listen()上, HTTPServer創建一個套接字,用於使用IOLoop監聽連接。 獲得連接后,它使用socket.accept()創建一個新的套接字,然后使用新的HTTPConnection與客戶端進行通信。

    HTTPConnection使用IOStream將數據傳輸到客戶端或從客戶端傳出。 IOStream使用IOLoop以異步和非阻塞方式執行此操作。 許多IOStreamHTTPConnection對象可以同時處於活動狀態,都使用相同的IOLoop

我希望這能回答你的一些問題。 我不知道一個好的結構圖,但總體思路對於其他網絡服務器也應該非常相似,所以可能有一些很好的信息。 你鏈接到的那篇深入的文章看起來確實很有用,所以如果你理解足夠,我建議你再給它一個 go :)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM