2015-08-20 51 views
-2

我開始一個長的基於文件的數據庫搜索,應該運行異步並且讓瀏覽器端單獨爲其他請求,但它似乎阻止。問題是什麼?如何使Tornado服務器端真的異步

class Handler(tornado.web.RequestHandler): 

    def initialize(self, param): 
     self.db = param 

    @tornado.web.asynchronous 
    @gen.engine 
    def post(self): 
     try: 
      self.set_status(200) 
      response = yield gen.Task(self.handleSearch, self.request.arguments) 
      self.finish(response) 
     except BaseException, s: 
      logging.exception(s) 
      self.finish("Error tonight, cause: %s" % s) 

    def handleSearch(self, request, callback): 
     return callback(self.db.createList(request)) 
+0

這是什麼意思,「讓瀏覽器一邊獨自[..],但它似乎阻止」 ?! – deceze

+0

我有一個可以發送多個請求到服務器(例如通過按鈕)的HTML頁面。當搜索查詢運行時,該頁面的其餘部分(例如通過其他按鈕的請求)應該可訪問, – Lazac

+0

那麼發生了什麼?你如何向服務器發送請求?如果*客戶端*阻塞聽起來更像*客戶端*不是異步的...! – deceze

回答

1

爲了使用龍捲風異步功能,你的功能需求是異步過,否則就不是真正異步

有龍捲風一些庫在那裏,check this out圖書館,但如果你沒「T找到您需要的庫,另一種解決方案是使用神奇的future

所以使用未來在Python代碼會是這樣

from concurrent.futures import ThreadPoolExecutor 

class Handler(tornado.web.RequestHandler): 

    def initialize(self, param): 
     self.db = param 

    @gen.coroutine 
    def post(self): 
     self.set_status(200) 
     with ThreadPoolExecutor(1) as execute: 
      r = yield execute.submit(self.handleSearch, param=request.arguments) 
      self.finish(r) 

    def handleSearch(self, param): 
     try: 
      return self.db.createList(param) # or time.sleep(4) (sth which block) 
     except Exception as e: 
      return False 

我已經測試過它,它可以正常工作,它與龍捲風100%兼容,所以你不會面臨任何問題

+0

如何將結果返回(或呈現)給Web客戶端? – Lazac

+0

它取決於tornado.web.RequestHandler,請閱讀:http://tornado.readthedocs.org/en/latest/web.html#thread-safety-notes – Mohammadhzp

+0

我試過自己寫(),但是不因爲在帖子末尾()連接已關閉。問題仍然是:我怎樣才能將結果發回。 – Lazac