我的問題是兩部分:龍捲風和異步請求處理
究竟是什麼意思的「異步服務器」,這是通常人們所說的龍捲風?有人可以提供一個具體的例子來說明概念/定義嗎?
在Tornado的情況下,「非阻塞」究竟意味着什麼?這與上面的異步性質有關嗎?另外,我在某處總是使用單線程來處理所有請求,這是否意味着請求會按順序逐一或並行處理?如果是後者,Tornado是如何做到的?
我的問題是兩部分:龍捲風和異步請求處理
究竟是什麼意思的「異步服務器」,這是通常人們所說的龍捲風?有人可以提供一個具體的例子來說明概念/定義嗎?
在Tornado的情況下,「非阻塞」究竟意味着什麼?這與上面的異步性質有關嗎?另外,我在某處總是使用單線程來處理所有請求,這是否意味着請求會按順序逐一或並行處理?如果是後者,Tornado是如何做到的?
龍捲風使用asynchronous, non-blocking I/O解決the C10K problem。這意味着所有I/O操作都是事件驅動的,也就是說,它們使用回調和事件通知,而不是等待操作返回。 Node.js和Nginx使用類似的模型。例外是tornado.database
,這是阻止。 Tornado IOLoop source如果您想詳細瞭解,有很好的文檔記錄。有關具體示例,請參見下文。
非阻塞和異步在Tornado中可互換使用,但在其他情況下有差異; this answer gives an excellent overview。龍捲風使用一個線程並按順序處理請求,儘管非常快,因爲沒有等待IO。在生產中,您通常會運行多個Tornado流程。
至於具體的例子,比如說你有龍捲風必須獲取的一些數據(異步)和響應HTTP請求,這裏的(非常粗略的)會發生什麼:
Tornado(與例如Django相比)的不同之處在於,在步驟2和3之間,流程可以繼續處理其他請求。 Tornado IOLoop只是保持連接打開並繼續處理其回調隊列,而使用Django(以及任何同步Web框架),線程將掛起,等待數據庫返回。
這是我測試web.py(cherrypy)和龍捲風的性能。 how is cherrypy working? it handls requests well compared with tornado when concurrence is low
寫得很好的答案。當你說'事件通知'時,你的意思是生成的事件表示I/O操作完成,以便調用回調函數?還有其他類型的事件嗎?謝謝! – skyork
是的,我的意思是通過epoll或kqueue通知Tornado傳入數據,即邊緣驅動的更改通知。 –