3

私は 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 を処理できますか?

4

0 に答える 0