私は PikaClient を使用して tornado で RabbitMQ に接続します。RabbitMQ tornado デモの単一のクライアントを client dict に変更して、複数のユーザーを処理できるようにします。
今、私は ajax を使用して Web ページで 5 秒ごとに新しいメッセージを取得していますが、動作しますが、ユーザーがブラウザーで接続を閉じた後、PikaClient 接続が閉じられず、RabbitMQ のソケット記述子番号が新しい要求が来るたびに増加し続けます。
接続を閉じるときに pikaclient 接続を閉じる必要があります
@tornado.web.asynchronous
def get(self):
uid = self.get_argument(“uid”, “0”)
self.uid = uid
if self.application.pika.has_key(uid):
pass
else:
self.application.pika[uid] = PikaClient(uuid=str(uid))
self.application.pika[uid].connect()
self.on_ajaxdone(uid)
def on_ajaxdone(self, uid):
if self.request.connection.stream.closed():
return
self.set_header("Content-type", "application/json")
self.write(json.dumps(self.application.pika[uid].get_messages()))
self.finish()
def on_connection_close(self):
try:
self.application.pika[self.uid].connection.close()
except:
pass
finally:
self.application.pika.pop(self.uid)
しかし、コードは機能しません。on_ajaxdone を add_timeout に変更します。タイムアウトが 2 秒を超えると、機能するようです
tornado.ioloop.IOLoop.instance().add_timeout(
time.time() + 5,
lambda: self.on_ajaxdone(uid))
タイムアウトなしで on_connection_close を処理できますか?