我正在尝试找出如何异步使用 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/