[英]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 上的epoll
, select
上的 select。 所以self._impl.register(fd, events | self.ERROR)
將“等待某個事件”請求傳遞給底層操作系統,也特別包括錯誤事件。
運行時, HTTPServer
將使用IOLoop.add_handler()
注冊 sockets 以接受連接。 當連接被接受時,它們將產生更多的通信 sockets,這可能還會通過IOStream
添加事件處理程序,它也可能調用add_handler()
。 因此,將在開始時添加新的處理程序,並在收到連接時添加。
是的,每個新的套接字連接都會有一個唯一的文件描述符。 HTTPServer
正在偵聽的原始套接字應該保留其文件描述符。 文件描述符由操作系統提供。
IOLoop
處理與 sockets 相關的事件,例如它們是否有數據可供讀取、是否可以寫入以及是否發生錯誤。 通過使用諸如epoll
或select
之類的操作系統服務,它可以非常有效地做到這一點。
IOStream
通過單個連接處理流數據,並使用IOLoop
異步執行此操作。 例如,一個IOStream
可以讀取盡可能多的數據,然后使用IOLoop.add_handler()
等待更多數據可用。
在listen()
上, HTTPServer
創建一個套接字,用於使用IOLoop
監聽連接。 獲得連接后,它使用socket.accept()
創建一個新的套接字,然后使用新的HTTPConnection
與客戶端進行通信。
HTTPConnection
使用IOStream
將數據傳輸到客戶端或從客戶端傳出。 此IOStream
使用IOLoop
以異步和非阻塞方式執行此操作。 許多IOStream
和HTTPConnection
對象可以同時處於活動狀態,都使用相同的IOLoop
。
我希望這能回答你的一些問題。 我不知道一個好的結構圖,但總體思路對於其他網絡服務器也應該非常相似,所以可能有一些很好的信息。 你鏈接到的那篇深入的文章看起來確實很有用,所以如果你理解足夠,我建議你再給它一個 go :)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.