2009-11-26 183 views
4

如何在支持持久連接的TornadoWeb中編寫Http服務器。Tornado Web和持久連接

我的意思就可以收到很多的請求,並回答他們沒有關閉連接。 它在async中如何工作?

我只是想知道如何編寫處理程序來處理持久連接。 它實際上會如何工作?

我處理這樣的:

class MainHandler(RequestHandler): 

count = 0 
@asynchronous 
def post(self): 

    #get header content type 
    content_type = self.request.headers.get('Content-Type') 
    if not content_type in ACCEPTED_CONTENT: 
     raise HTTPError(403, 'Incorrect content type') 
    text = self.request.body 
    self.count += 1  

    command = CommandObject(text, self.count, callback = self.async_callback(self.on_response)) 
    command.execute() 

def on_response(self, response): 
    if response.error: raise HTTPError(500) 
    body = response.body 
    self.write(body) 
    self.flush() 

執行調用回調時完成。

是我的假定權利,這樣的事情將被稱爲多次 和一個連接數會隨着客戶端的每個httprequest增加? 但對於每個連接,我將有單獨的計數值?

回答

0

龍捲風Web框架實際上並配備了支持持久連接,所以應該沒有必要寫自己的服務器它自己的服務器上執行。在documentation中有一節介紹如何在生產環境中使用它(在nginx之後)。

+0

是的我知道,但沒有解釋如何實際處理持續連接。 – Engrost

0

爲從源頭tornado.web模塊,你可以看到一個新的處理程序總是實例化,我不覺得有什麼,反正你可以再利用處理。

5

我不認爲你的假設是正確的。我對Tornado服務器工作方式的理解是,客戶端的每個請求都會產生一個新的RequestHandler。修飾符@tornado.web.asynchronous的作用是防止服務器在處理函數(postget等)返回時自動關閉連接。但在一天結束時,我認爲每個請求只有一個響應。

我不相信從客戶端其他請求將去RequestHandler類的同一個實例。相反,我的理解是,Tornado的設立是爲了允許長時間輪詢的範例。這裏是通信流的一個例子:

  1. 客戶端發出一個POST請求龍捲風服務器
  2. 龍捲風服務器進行檢查,看是否有應對準備好了,如果不是你可以在RequestHandler添加到某種棧或隊列(取決於你的應用程序的體系結構)
  3. 服務器來了一個響應(也許另一用戶加入消息,該消息需要被分佈到打開連接等的隊列),並分配響應返回給RequestHandler和然後調用finish()函數關閉連接
  4. 客戶端發出另一個POST請求,重複上述過程

我認爲,如果你想實現你要尋找到tornado.websockethttp://www.tornadoweb.org/documentation/websocket.html)真正的持久連接。我還沒有嘗試過這個模塊,所以我害怕我不能在那裏提供任何輸入。

祝你好運!