1

在 tornadoredis 中,管道的正确方法是什么?文档不清楚。我正在使用 tornadoredis 库。

    import tornadoredis

    @tornado.web.asynchronous
    @tornado.gen.engine
    def get(self):
        self.pipe_threads = []
        sw = stopwatch.Timer()
        if not self.get_cookie('rtbhui'):
            self.cookie_id=str(uuid4())
            self.set_cookie('test', self.cookie_id, domain='rtb.rtbhui.com',expires_days=365*2)
        else:
            self.cookie_id = self.get_cookie('test')

        t = yield tornado.gen.Task(c.pipeline)
        yield tornado.gen.Task(t.set,'key', 'value')
        yield tornado.gen.Task(t.execute)



starting
ERROR:root:Uncaught exception GET /apixel?bid=eydhdmlkJzogJ2luZm9AYWRtYWdpYy5jby5qcCcsICdjcmlkJzogJzIwNzY3MDczNTE1JywgJ21hYmlkJzogeydub2RlJzogTm9uZSwgJ2hvZCc6ICcxMycsICdjaWQnOiAnMzYnLCAnaW5kdXN0cnknOiBOb25lLCAnZXgnOiAnMScsICd2aWQxJzogJzI5JywgJ2Rvdyc6ICczJ30sICdwcmlkJzogeydob2QnOiAnMTMnLCAnd295JzogJzE4JywgJ2NpZCc6ICczNicsICdkb3cnOiAnMycsICdzc3AnOiAnYWR4JywgJ3N0JzogTm9uZSwgJ2J0JzogJ2ZpcmVmb3gnLCAnY3R5JzogJ3Rva3lvJywgJ2V4JzogJzEnLCAndmlkMic6ICcyMjInLCAnZHQnOiAnMScsICdvcyc6ICdtYWMnLCAndmlkMSc6ICcyOSd9LCAnYWdpZCc6ICc0NTQ3OTE3Nzk1JywgJ2Nvb2tpZWlkJzogJ3JldGFnZXRpbmc6Y29va2llJywgJ2RpZCc6ICd5YWhvby5jb20nLCAndmFsaWRhdGlvbic6IFRydWV9 (127.0.0.1)
HTTPRequest(protocol='http', host='127.0.0.1:8055', method='GET', uri='/apixel?bid=eydhdmlkJzogJ2luZm9AYWRtYWdpYy5jby5qcCcsICdjcmlkJzogJzIwNzY3MDczNTE1JywgJ21hYmlkJzogeydub2RlJzogTm9uZSwgJ2hvZCc6ICcxMycsICdjaWQnOiAnMzYnLCAnaW5kdXN0cnknOiBOb25lLCAnZXgnOiAnMScsICd2aWQxJzogJzI5JywgJ2Rvdyc6ICczJ30sICdwcmlkJzogeydob2QnOiAnMTMnLCAnd295JzogJzE4JywgJ2NpZCc6ICczNicsICdkb3cnOiAnMycsICdzc3AnOiAnYWR4JywgJ3N0JzogTm9uZSwgJ2J0JzogJ2ZpcmVmb3gnLCAnY3R5JzogJ3Rva3lvJywgJ2V4JzogJzEnLCAndmlkMic6ICcyMjInLCAnZHQnOiAnMScsICdvcyc6ICdtYWMnLCAndmlkMSc6ICcyOSd9LCAnYWdpZCc6ICc0NTQ3OTE3Nzk1JywgJ2Nvb2tpZWlkJzogJ3JldGFnZXRpbmc6Y29va2llJywgJ2RpZCc6ICd5YWhvby5jb20nLCAndmFsaWRhdGlvbic6IFRydWV9', version='HTTP/1.1', remote_ip='127.0.0.1', body='', headers={'Connection': 'keep-alive', 'Accept-Language': 'en-us,en;q=0.5', 'Accept-Encoding': 'gzip, deflate', 'Cache-Control': 'max-age=0', 'Host': '127.0.0.1:8055', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:11.0) Gecko/20100101 Firefox/11.0'})
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/tornado-2.2.1-py2.7.egg/tornado/web.py", line 1074, in wrapper
    return method(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tornado-2.2.1-py2.7.egg/tornado/gen.py", line 107, in wrapper
    runner.run()
  File "/usr/local/lib/python2.7/dist-packages/tornado-2.2.1-py2.7.egg/tornado/gen.py", line 319, in run
    yielded = self.gen.throw(*exc_info)
  File "/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbTornadoServer/tornadoServer.py", line 81, in get
    t = yield tornado.gen.Task(c.pipeline)
  File "/usr/local/lib/python2.7/dist-packages/tornado-2.2.1-py2.7.egg/tornado/gen.py", line 341, in run
    self.yield_point.start(self)
  File "/usr/local/lib/python2.7/dist-packages/tornado-2.2.1-py2.7.egg/tornado/gen.py", line 223, in start
    self.func(*self.args, **self.kwargs)
TypeError: pipeline() got an unexpected keyword argument 'callback'
ERROR:root:500 GET /apixel?bid=eydhdmlkJzogJ2luZm9AYWRtYWdpYy5jby5qcCcsICdjcmlkJzogJzIwNzY3MDczNTE1JywgJ21hYmlkJzogeydub2RlJzogTm9uZSwgJ2hvZCc6ICcxMycsICdjaWQnOiAnMzYnLCAnaW5kdXN0cnknOiBOb25lLCAnZXgnOiAnMScsICd2aWQxJzogJzI5JywgJ2Rvdyc6ICczJ30sICdwcmlkJzogeydob2QnOiAnMTMnLCAnd295JzogJzE4JywgJ2NpZCc6ICczNicsICdkb3cnOiAnMycsICdzc3AnOiAnYWR4JywgJ3N0JzogTm9uZSwgJ2J0JzogJ2ZpcmVmb3gnLCAnY3R5JzogJ3Rva3lvJywgJ2V4JzogJzEnLCAndmlkMic6ICcyMjInLCAnZHQnOiAnMScsICdvcyc6ICdtYWMnLCAndmlkMSc6ICcyOSd9LCAnYWdpZCc6ICc0NTQ3OTE3Nzk1JywgJ2Nvb2tpZWlkJzogJ3JldGFnZXRpbmc6Y29va2llJywgJ2RpZCc6ICd5YWhvby5jb20nLCAndmFsaWRhdGlvbic6IFRydWV9 (127.0.0.1) 6.69ms
4

2 回答 2

3

Mybe有点太晚了,但仍然有人可能会偶然发现这个问题。

当您使用带有和包装器的yield语句时,您会将代码的执行延迟到屈服点以下,直到操作(您在语句中开始)完成。在大多数情况下,您将使用语句来等待数据传输完成。tornado.gen.enginetornado.gen.Taskyield gen.Task(..)yield

使用管道的要点是将多个redis命令打包到一个请求中,以减少对Redis服务器的请求数。因此,当您向管道添加命令时,不会向服务器发送任何内容。此时无需使用yield语句。

调用该execute方法时,之前打包到管道中的所有命令都将发送到 Redis 服务器。即使您不想等待请求完成来检查结果,也最好用包装execute方法调用。yield gen.Task()

使用该tornado-redis.Client.pipeline方法的代码可能如下所示:

client = Client()
pipe = client.pipeline()
pipe.hset('foo', 'bar', 1)
pipe.expire('foo', 60)

re1, res2 = yield gen.Task(pipe.execute)

或者你可以使用'with'语句:

client = Client()
with client.pipeline() as pipe:
    pipe.hset('foo', 'bar', 1)
    pipe.expire('foo', 60)

    res1, res2 = yield gen.Task(pipe.execute)

管道功能使用 Redis 事务功能。你可以在这篇文章中读到它们:http ://redis.io/topics/transactions

于 2012-11-09T09:28:28.210 回答
1

在您的情况下,它看起来像pipeline函数不能与gen.engine.

您是否尝试过使用t = c.pipeline()而不是t = yield tornado.gen.Task(c.pipeline)

于 2012-06-20T12:11:26.723 回答