私はBrukvaサイトでサンプルアプリを見たとき、彼らはTornadoでRedis接続を処理する適切な方法は何ですか? (非同期 - パブ/サブ)
のWebSocketで「 のinit」方式で新しい接続を作っている、asycクライアントBrukvaと私のトルネードアプリケーションと一緒にRedisのを使用しています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()
websocketの場合は問題ありませんが、一般的なTornado RequestHandlerのポストメソッドでは、長いポーリング操作(公開サブスクリプションモデル)でそれを処理する方法は問題ありません。私は更新ハンドラのすべてのポストメソッドで新しいクライアントconnetionを作っているこれは正しいアプローチですか?私がredisコンソールでチェックすると、新しいポスト操作ごとにクライアントが増えています。ここで
私のコードのサンプルです。
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()
同様のケースのサンプルコードを提供していただければ幸いです。
Redis、ZMQ、Tornadoを使用したPythonでの非同期PubSub - https://github.com/abhinavsingh/async_pubsub –