0
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 装饰器的异步操作引起的。

4

1 回答 1

3

这可能是因为您在调用时没有取消订阅/断开与 Redis 的连接self.finish(),因此当另一条消息到达时,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()
于 2013-11-01T11:48:31.493 回答