【问题标题】:how to do asynchronous writes to redis in tornado如何在龙卷风中对redis进行异步写入
【发布时间】:2012-07-30 23:33:49
【问题描述】:

感谢this post,我正在试用异步驱动程序tornado-redis。在演示 (Github example) 中,它显示了如何使用该库进行异步获取,但我不清楚这些集合是否也是异步的(它们确实具有回调函数)。

如果可能的话,使用tornado-redis 进行异步写入的正确方法是什么?会不会是这样的:

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

【问题讨论】:

  • 您有什么不清楚的地方?您问题中的代码示例看起来不错。

标签: python redis tornado


【解决方案1】:

查看tornado-redis 代码。 Client.set 方法有如下定义:

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)

与 gen 模块分开的类:

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.

【讨论】:

  • 谢谢。我可以在 Tornado 应用程序的自定义类中使用gen 方法,也就是说,not 在 RequestHandler 类/子类中。如果没有,在这种情况下我应该如何异步使用它?像上面的第二个选项一样,通过为 get/set 方法提供回调?
  • gen 是语法糖,所以是的。您可以通过任何方式使用gen.engine
  • 查看:tornadoweb.org/documentation/gen.html#decorator,更准确地说,gen.engine 应该只用于异步方法。在上面的“单独类”示例中,set 方法不是异步的?
  • t.set 是异步的。如果您将在非异步方法上使用gen.Task - 它会抛出参数错误,就像在这个问题stackoverflow.com/questions/11679040/… 中一样。
  • 对不起,我有点困惑,文档说“在没有回调参数的函数上使用 gen.engine 是没有意义的”。在上面的例子中,set(self, key, value) 方法的回调参数是什么(t.set 是不同的,我猜你指的是tornadoredis 方法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多