我尝试通过Tornado + Jquery实现“Long polling”。有一个问题是:在建立轮询后,我关闭IE(而不是其他浏览器)连接仍处于活动状态,程序继续运行直到达到退出状态。
服务器
class Poll(BaseHandler):
@tornado.web.asynchronous
def post(self):
self.get_data(callback=self.async_callback(self.on_finish))
print("Exiting from async.")
def get_data(self, callback,t=30):
data={}
data["t"]=datetime.datetime.now()
if self.request.connection.stream.closed():
print "Connection closed"
return
if t:
tornado.ioloop.IOLoop.instance().add_timeout(time.time() + 2, lambda: self.get_data(callback, t-1))
else:
callback(data)
def on_finish(self,data):
self.write(json.dumps(data))
self.finish()
客户端:
$.ajax({url: "/poll",
type: "POST",
dataType: "json",
async:true,
success: function(data){
alert(data)
interval = window.setTimeout(ldy.poll, 0);
}
});
如果我使用FF或Chrome。当我关闭浏览器时, self.request.connection.stream.closed()将变为TRUE,但是对于IE,它始终为False。因此,如果用户在两个页面之间切换(使用长轮询),服务器的资源将很快耗尽,并且每次单击都将挂起,直到一个轮询退出。 为什么?以及如何解决它。救命!救命! T_T