【问题标题】:tornado redis error: "finish() called twice"tornado redis 错误:“finish() 调用了两次”
【发布时间】:2013-11-11 19:02:21
【问题描述】:
class RedisHandler(BaseHandler):
@tornado.web.authenticated
@tornado.web.asynchronous
@tornado.gen.engine
def post(self):
    self.client = tornadoredis.Client()
    self.client.connect()
    yield tornado.gen.Task(self.client.subscribe,'notification')
    self.client.listen(self.on_message)

def on_message(self,msg):
    if msg.kind == 'message':
        self.finish(dict(complete=True,message=msg.body))
    return

以上代码引发:

RuntimeError: finish() 调用了两次

这可能是由于使用了没有@asynchronous 装饰器的异步操作造成的。

【问题讨论】:

    标签: python redis tornado long-polling


    【解决方案1】:

    这可能是因为你在调用self.finish()时没有取消订阅/断开与Redis的连接,所以当另一条消息到达时,再次调用on_message()

    def on_message(self,msg):
        if msg.kind == 'message':
    
            self.finish(dict(complete=True,message=msg.body))
    
            self.client.unsubscribe('notification')
            self.client.disconnect()
    

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 2018-11-29
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2015-09-22
      • 2017-06-25
      • 2013-01-21
      • 2012-09-08
      相关资源
      最近更新 更多