From: Ben Darnell Date: Fri, 9 Sep 2011 05:51:45 +0000 (-0700) Subject: Add on_connection_close hook to chat demo to clean up after closed connections. X-Git-Tag: v2.1.0~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b5adf99e43c6e8d1c5f091f3733c77a19579363;p=thirdparty%2Ftornado.git Add on_connection_close hook to chat demo to clean up after closed connections. Closes #354. --- diff --git a/demos/chat/chatdemo.py b/demos/chat/chatdemo.py index 48f8a908e..48c82f8a7 100755 --- a/demos/chat/chatdemo.py +++ b/demos/chat/chatdemo.py @@ -62,7 +62,7 @@ class MainHandler(BaseHandler): class MessageMixin(object): - waiters = [] + waiters = set() cache = [] cache_size = 200 @@ -77,7 +77,11 @@ class MessageMixin(object): if recent: callback(recent) return - cls.waiters.append(callback) + cls.waiters.add(callback) + + def cancel_wait(self, callback): + cls = MessageMixin + cls.waiters.remove(callback) def new_messages(self, messages): cls = MessageMixin @@ -87,7 +91,7 @@ class MessageMixin(object): callback(messages) except: logging.error("Error in waiter callback", exc_info=True) - cls.waiters = [] + cls.waiters = set() cls.cache.extend(messages) if len(cls.cache) > self.cache_size: cls.cache = cls.cache[-self.cache_size:] @@ -114,7 +118,7 @@ class MessageUpdatesHandler(BaseHandler, MessageMixin): @tornado.web.asynchronous def post(self): cursor = self.get_argument("cursor", None) - self.wait_for_messages(self.async_callback(self.on_new_messages), + self.wait_for_messages(self.on_new_messages, cursor=cursor) def on_new_messages(self, messages): @@ -123,6 +127,9 @@ class MessageUpdatesHandler(BaseHandler, MessageMixin): return self.finish(dict(messages=messages)) + def on_connection_close(self): + self.cancel_wait(self.on_new_messages) + class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin): @tornado.web.asynchronous