2013-10-10 41 views
0

讓我們從一些例子開始。有圖書館tornado-redis以下是使用它的例子。 Python與龍捲風 - 類實現與太多異步

import tornadoredis 
import tornado.web 
import tornado.gen 

c = tornadoredis.Client() 
c.connect() 

class MainHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    @tornado.gen.engine 
    def get(self): 
     foo = yield tornado.gen.Task(c.get, 'foo') 
     bar = yield tornado.gen.Task(c.get, 'bar') 
     zar = yield tornado.gen.Task(c.get, 'zar') 
     self.set_header('Content-Type', 'text/html') 
     self.render("template.html", title="Simple demo", foo=foo, bar=bar, zar=zar) 

而且一切都很簡單。但我需要編寫一個包裝類。編碼對我來說沒有問題,但我認爲我錯了異步模式。

我的封裝類應該異步調用redis類,對吧!現在,我還必須以處理程序可以用Task(異步)調用它的方式異步實現我的類嗎?然後我會有兩個異步位置。 保持Tronado異步並保持簡單的正確方法是什麼?

Handler --async call--> MyWrapper --async call--> tronado-redis 

Handler --sync call--> MyWrapper --async call--> tronado-redis 

Handler --async call--> MyWrapper --sync call--> tronado-redis 

回答

1

異步函數只能通過其它異步函數調用。由於tornado-redis是異步的,因此RequestHandler和其間的所有內容也必須是異步的。

請注意,@tornado.web.asynchronous裝飾器僅用於RequestHandler方法 - 在RequestHandler之外製作異步方法,您可以單獨使用@gen.coroutine@gen.engine