3

我使用 PikaClient 在龙卷风中连接到 RabbitMQ,我将 RabbitMQ 龙卷风演示中的单个客户端更改为客户端字典,以便我可以处理多个用户。

现在我使用 ajax 在网页中每 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,当timeout>2s时,好像可以了

tornado.ioloop.IOLoop.instance().add_timeout(
        time.time() + 5,
        lambda: self.on_ajaxdone(uid))

我可以在没有任何超时的情况下处理 on_connection_close 吗?

4

0 回答 0