如何异步使用Tornado和Redis?

Hel*_*tos 12 python asynchronous tornado redis

我试图找到如何异步使用Redis和Tornado.我找到了龙卷风 -但是我需要的不仅仅是yield在代码中添加一个.

我有以下代码:

import redis
import tornado.web

class WaiterHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self):
        client = redis.StrictRedis(port=6279)
        pubsub = client.pubsub()
        pubsub.subscribe('test_channel')

        for item in pubsub.listen():
            if item['type'] == 'message':
                print item['channel']
                print item['data']

        self.write(item['data'])
        self.finish()


class GetHandler(tornado.web.RequestHandler):

    def get(self):
        self.write("Hello world")


application = tornado.web.Application([
    (r"/", GetHandler),
    (r"/wait", WaiterHandler),
])

if __name__ == '__main__':
    application.listen(8888)
    print 'running'
    tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

我需要访问/网址并获取"Hello World",而有一个请求待处理/wait.我该怎么做?

ron*_*nix 5

您不应该在主Tornado线程中使用Redis pub/sub,因为它会阻止IO循环.您可以在主线程中处理来自Web客户端的长轮询,但是您应该创建一个单独的线程来侦听Redis.然后ioloop.add_callback(),您可以threading.Queue在接收消息时使用和/或a 与主线程进行通信.


Joe*_*oes 5

您需要使用Tornado IOLoop兼容的redis客户端.

其中很少有,toredis,brukva等.

这是toredis中的pubsub示例:https://github.com/mrjoes/toredis/blob/master/tests/test_handler.py