如何获得tornadoredis听取价值

时间:2015-04-01 10:37:13

标签: redis tornado coroutine

我想用龙卷风和redis写一个聊天演示。我使用redis订阅,但我写的不是工作。当我运行代码时,iterm输出

listening 8000
GroupChat here
getMsg here
None
None

我在redis-cli中发布了testc helloword,iterm输出:

[I 150401 18:30:57 web:1825] 304 GET /groupchat?key=testc (127.0.0.1) 2.40ms
Message(kind=u'message', channel=u'testc', body=u'helloword', pattern=u'testc')

我只想在GroupChat.get中获取Message,但是我得到None。有人帮帮我吗?

GroupChat代码在这里:

class GroupChat(tornado.web.RequestHandler):
    def initialize(self):
        print 'GroupChat here'
        self.c = tornadoredis.Client(host=CONFIG['REDIS_HOST'], port=CONFIG['REDIS_PORT'], password=CONFIG['REDIS_AUTH'])
        self.channelMsgModel = channelMsgModel(self.c)
    @tornado.gen.coroutine
    def get(self):
        try:
            key = self.get_argument('key')
            info = yield self.channelMsgModel.getMsg(key)
            print info
            self.finish(info)
        except Exception, e:
            print e
        pass

channelMsgModel代码在这里:

import tornado.gen

class channelMsgModel :
    timeout = 10
    def __init__(self, redisobj):
        self.redisobj = redisobj

    @tornado.gen.coroutine
    def getMsg(self, key):
        print 'getMsg here'
        yield tornado.gen.Task(self.redisobj.subscribe, key)
        info = self.redisobj.listen(self.on_message)
        print info
        raise tornado.gen.Return(info)

    def on_message(self, msg):
        if (msg.kind == 'message'):
            print msg
            return msg
        elif (msg.kind == 'unsubscribe'):
            self.redisobj.disconnect()
            # raise tornado.gen.Return(False)

1 个答案:

答案 0 :(得分:0)

使用toro.Queue(将在即将推出的版本4.2中包含在Tornado中):

class channelMsgModel:
    def __init__(self, redisobj):
        self.redisobj = redisobj
        self.queue = toro.Queue()

    @gen.coroutine
    def getMsg(self, key):
        yield gen.Task(self.redisobj.subscribe, key)
        self.redisobj.listen(self.on_message)
        info = yield self.queue.get()
        raise tornado.gen.Return(info)

    def on_message(self, msg):
        if (msg.kind == 'message'):
            self.queue.put_nowait(msg)
        elif (msg.kind == 'unsubscribe'):
            self.redisobj.disconnect()