मैं asyc ग्राहक Brukva के साथ मेरी तूफान आवेदन के साथ Redis उपयोग कर रहा हूँ, जब मैं Brukva स्थल पर नमूना क्षुधा को देखा वे WebSocket में पर "init" विधि नए कनेक्शन बना रहे हैंटोरनाडो में रेडिस कनेक्शन को संभालने का सही तरीका क्या है? (Async - पब/उप)
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()
वेबसाइकिल के मामले में यह ठीक है लेकिन इसे सामान्य टॉरनाडो अनुरोध में कैसे संभालना हैडलर पोस्ट विधि का कहना है कि लंबे मतदान ऑपरेशन (प्रकाशित-सदस्यता मॉडल)। मैं अद्यतन हैंडलर की प्रत्येक पोस्ट विधि में नया ग्राहक connetion बना रहा हूँ यह सही दृष्टिकोण है ?? जब मैंने रेडिस कंसोल पर चेक किया तो मुझे लगता है कि ग्राहक हर नए पोस्ट ऑपरेशन में बढ़ रहे हैं।
यहाँ मेरी कोड का एक नमूना है।
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()
मैं अगर तुम इसी तरह के मामले के लिए कुछ नमूना कोड प्रदान करते हैं की सराहना करते हैं।
रेडिस, जेडएमक्यू, टॉरनाडो का उपयोग करते हुए पायथन में असिंक्रोनस पबसब - https://github.com/abhinavsingh/async_pubsub –