2012-08-02 86 views
2

感謝this post,我嘗試了異步驅動程序tornado-redis。從演示(Github example)中可以看出,如何進行異步獲取使用這個庫,但我不清楚如果這些集合也是異步的(它們有回調函數)。如何在龍捲風中執行對redis的異步寫入

因此,如果可能的話,使用tornado-redis進行異步寫入的正確方法是什麼?它會是這樣的:

@tornado.web.asynchronous 
@tornado.gen.engine 
def post(self): 
    ... 
    yield tornado.gen.Task(t.set,'key', 'value') 
+0

什麼是不明確的嗎?代碼示例在你的問題看起來不錯。 – 2012-08-02 07:05:49

回答

3

看看tornado-redis的代碼。 Client.set方法有以下defenition:

def set(self, key, value, callback=None): 
    self.execute_command('SET', key, value, callback=callback) 

所以,是的,它需要回調,可與gen.Task使用。

正確的方式來寫異步:你在問題中所述

  1. 方式,使用gen
  2. 方式,在github例子中有描述。從GitHub

例子:

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

def on_set(result): 
    log.debug("set result: %s" % result) 

c.set('foo', 'Lorem ipsum #1', on_set) 
c.set('bar', 'Lorem ipsum #2', on_set) 
c.set('zar', 'Lorem ipsum #3', on_set) 

與根模塊單獨的類:

class MyRedisWrapper(object): 
    @gen.engine 
    def set(self, key, value): 
     yield tornado.gen.Task(t.set, key, value) 

r = MyRedisWrapper() 

class MyHandler(tornado.web.RequestHandler): 
    def get(self): 
     r.set('key', 'value') #It will work, but not sure about efficiency. 
+0

謝謝。我可以在Tornado應用程序的自定義類中使用'gen'方法,也就是說,*不在* RequestHandler類/子類中。如果不是,在這種情況下我應該如何異步使用它?通過向get/set方法提供一個回調,就像上面的第二個選項一樣? – MLister 2012-08-03 21:54:12

+0

'gen'是句法糖,所以是的。你可以用任何方法使用'gen.engine'。 – 2012-08-03 22:40:25

+0

@MLister更新了我的答案。 – 2012-08-03 22:49:00