estoy usando Redis junto con mi solicitud Tornado con el cliente ASYC Brukva, cuando miraba a las aplicaciones de ejemplo en Brukva sitio que están haciendo nueva conexión en el método "init" en WebSocket¿Cuál es la forma correcta de manejar la conexión Redis en Tornado? (Asíncrono - Pub/Sub)
class MessagesCatcher(tornado.websocket.WebSocketHandler):
def __init__(self, *args, **kwargs):
super(MessagesCatcher, self).__init__(*args, **kwargs)
self.client = brukva.Client()
self.client.connect()
self.client.subscribe('test_channel')
def open(self):
self.client.listen(self.on_message)
def on_message(self, result):
self.write_message(str(result.body))
def close(self):
self.client.unsubscribe('test_channel')
self.client.disconnect()
está bien en el caso de websocket pero cómo manejarlo en el método de publicación Tornado RequestHandler común dice operación de sondeo larga (modelo de publicación-suscripción). Estoy haciendo una nueva conexión de cliente en cada método de publicación de controlador de actualización ¿este es el enfoque correcto? Cuando revisé en la consola redis veo que los clientes aumentan en cada nueva operación de publicación.
Aquí es una muestra de mi código.
c = brukva.Client(host = '127.0.0.1')
c.connect()
class MessageNewHandler(BaseHandler):
@tornado.web.authenticated
def post(self):
self.listing_id = self.get_argument("listing_id")
message = {
"id": str(uuid.uuid4()),
"from": str(self.get_secure_cookie("username")),
"body": str(self.get_argument("body")),
}
message["html"] = self.render_string("message.html", message=message)
if self.get_argument("next", None):
self.redirect(self.get_argument("next"))
else:
c.publish(self.listing_id, message)
logging.info("Writing message : " + json.dumps(message))
self.write(json.dumps(message))
class MessageUpdatesHandler(BaseHandler):
@tornado.web.authenticated
@tornado.web.asynchronous
def post(self):
self.listing_id = self.get_argument("listing_id", None)
self.client = brukva.Client()
self.client.connect()
self.client.subscribe(self.listing_id)
self.client.listen(self.on_new_messages)
def on_new_messages(self, messages):
# Closed client connection
if self.request.connection.stream.closed():
return
logging.info("Getting update : " + json.dumps(messages.body))
self.finish(json.dumps(messages.body))
self.client.unsubscribe(self.listing_id)
def on_connection_close(self):
# unsubscribe user from channel
self.client.unsubscribe(self.listing_id)
self.client.disconnect()
aprecio si usted proporciona un código de ejemplo para el caso similar.
PubSub asincrónico en Python usando Redis, ZMQ, Tornado - https://github.com/abhinavsingh/async_pubsub –