python - 如何异步使用 Tornado 和 Redis?

标签 python asynchronous redis tornado

我正在尝试找出如何异步使用 Redis 和 Tornado。我找到了 tornado-redis但我需要的不仅仅是在代码中添加一个 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()

/wait 中有待处理的请求时,我需要访问 / url 并获取“Hello World”。 我该怎么做?

最佳答案

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

关于python - 如何异步使用 Tornado 和 Redis?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15144809/

相关文章:

python - 如何在 pycharm 中自动完成列表的内部元素?

python - 在递归中分配局部变量

python - 如何在异步方法中将结果存储在列表中?

javascript - 为什么 require.js 和所有其他库之间有如此大的跳跃?

php - 如何查询laravel采集结果

ruby-on-rails - Sidekiq/Redis 对不存在的作业进行排队

python - Django:批量操作

python - 在 numpy 中索引 3d 网格数据的球形子集

asynchronous - 如何在 Flutter 的 Firebase 快照上调用 Future?

redis - 如何在 Nestjs Bull 中一次执行预定义数量的作业