2012-05-14 6 views
1

토네이도에있는 파이프 라인에 적절한 방법은 무엇입니까? 설명서가 명확하지 않습니다. 나는 토네이도를 사용하고있다. 귀하의 경우 pipeline 기능이 gen.engine와 함께 사용할 수 없습니다 것처럼 보인다에서파이썬 토네이도 redis - 파이프 라인을 수행하는 방법

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 
+0

결국 방법을 찾아 냈습니까? 업데이 트가 많이 감사하겠습니다. 감사! – MLister

답변

1

.

t = yield tornado.gen.Task(c.pipeline) 대신 t = c.pipeline()을 사용해 보셨습니까?

3

Mybe 너무 늦기는하지만 누군가가 여전히이 질문에 걸림이 될 수 있습니다.

당신이 (당신이 yield gen.Task(..) 성명에서 시작한 것을) 작동 할 때까지 항복 점 이하의 코드의 실행을 지연 tornado.gen.enginetornado.gen.Task 래퍼과 yield 문을 사용

가 완료됩니다. 대부분의 경우 데이터 전송 완료를 기다리는 데 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) 

나 :

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

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

파이프 라인 기능은 레디 스 트랜잭션 함수를 사용합니다. 이 기사에서 해당 내용을 읽을 수 있습니다. http://redis.io/topics/transactions

관련 문제