2012-05-11 209 views
5

我的問題是兩部分:龍捲風和異步請求處理

  1. 究竟是什麼意思的「異步服務器」,這是通常人們所說的龍捲風?有人可以提供一個具體的例子來說明概念/定義嗎?

  2. 在Tornado的情況下,「非阻塞」究竟意味着什麼?這與上面的異步性質有關嗎?另外,我在某處總是使用單線程來處理所有請求,這是否意味着請求會按順序逐一或並行處理?如果是後者,Tornado是如何做到的?

回答

10
  1. 龍捲風使用asynchronous, non-blocking I/O解決the C10K problem。這意味着所有I/O操作都是事件驅動的,也就是說,它們使用回調和事件通知,而不是等待操作返回。 Node.js和Nginx使用類似的模型。例外是tornado.database,這是阻止。 Tornado IOLoop source如果您想詳細瞭解,有很好的文檔記錄。有關具體示例,請參見下文。

  2. 非阻塞和異步在Tornado中可互換使用,但在其他情況下有差異; this answer gives an excellent overview。龍捲風使用一個線程並按順序處理請求,儘管非常快,因爲沒有等待IO。在生產中,您通常會運行多個Tornado流程。

至於具體的例子,比如說你有龍捲風必須獲取的一些數據(異步)和響應HTTP請求,這裏的(非常粗略的)會發生什麼:

  1. 龍捲風接收請求並在您的應用程序中調用相應的處理程序方法
  2. 您的處理程序方法發出異步數據庫調用,並帶有回調
  3. 數據庫調用返回,調用回調併發送響應。

Tornado(與例如Django相比)的不同之處在於,在步驟2和3之間,流程可以繼續處理其他請求。 Tornado IOLoop只是保持連接打開並繼續處理其回調隊列,而使用Django(以及任何同步Web框架),線程將掛起,等待數據庫返回。

+0

寫得很好的答案。當你說'事件通知'時,你的意思是生成的事件表示I/O操作完成,以便調用回調函數?還有其他類型的事件嗎?謝謝! – skyork

+0

是的,我的意思是通過epoll或kqueue通知Tornado傳入數據,即邊緣驅動的更改通知。 –