Tôi đang sử dụng Redis cùng với ứng dụng Tornado của tôi với khách hàng Bản Noi Quy Brukva, khi tôi nhìn vào các ứng dụng mẫu tại trang web Brukva họ đang thực hiện kết nối mới trên "init" phương pháp trong WebSocketCách thích hợp để xử lý kết nối Redis trong Tornado là gì? (Không đồng bộ - 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()
Phạt tiền trong trường hợp websocket nhưng cách xử lý trong phương thức đăng bài Tornado RequestHandler thông thường nói hoạt động bỏ phiếu dài (mô hình xuất bản-đăng ký). Tôi đang làm cho khách hàng mới connetion trong mỗi phương pháp đăng bài của bộ xử lý cập nhật này là phương pháp tiếp cận đúng ?? Khi tôi kiểm tra tại giao diện điều khiển redis tôi thấy rằng khách hàng ngày càng tăng trong mỗi hoạt động bài mới.
Đây là mẫu mã của tôi.
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()
Tôi đánh giá cao nếu bạn cung cấp một số mã mẫu cho trường hợp tương tự.
PubSub không đồng bộ bằng Python sử dụng Redis, ZMQ, Tornado - https://github.com/abhinavsingh/async_pubsub –