Sto usando Redis insieme con la mia applicazione Tornado con ASYC cliente Brukva, quando ho guardato le applicazioni di esempio al sito Brukva stanno facendo nuova connessione su "init" metodo websocketQual è il modo corretto di gestire la connessione Redis in Tornado? (Async - 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()
la sua multa nel caso di websocket ma come gestirlo nel comune metodo di post Tornado RequestHandler dice operazione polling lungo (modello di sottoscrizione-pubblicazione). Sto facendo una nuova connessione client in ogni metodo post di gestore di aggiornamento è questo l'approccio giusto ?? Quando ho controllato la console redis, vedo che i client aumentano in ogni nuova operazione di post.
Ecco un esempio del mio codice.
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()
Apprezzo se si fornisce alcuni esempi di codice per il caso simile.
PubSub asincrono in Python utilizzando Redis, ZMQ, Tornado - https://github.com/abhinavsingh/async_pubsub –