From e8f267c1cea3e38dd2741e21afe6ebc4644d6fc7 Mon Sep 17 00:00:00 2001 From: Leechael Yim Date: Sun, 9 Jun 2013 21:03:50 +0800 Subject: [PATCH] Added signal handler for graceful shutdown. --- msgpackrpc/loop.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/msgpackrpc/loop.py b/msgpackrpc/loop.py index a8a0514..200da60 100644 --- a/msgpackrpc/loop.py +++ b/msgpackrpc/loop.py @@ -1,4 +1,6 @@ from tornado import ioloop +import signal +from time import time class Loop(object): """\ @@ -19,6 +21,10 @@ def start(self): Starts the Tornado's ioloop if it's not running. """ + handler = _LoopShutdownHandler(self._ioloop) + signal.signal(signal.SIGINT, handler) + signal.signal(signal.SIGTERM, handler) + signal.signal(signal.SIGHUP, handler) self._ioloop.start() def stop(self): @@ -42,3 +48,20 @@ def dettach_periodic_callback(self): if self._periodic_callback is not None: self._periodic_callback.stop() self._periodic_callback = None + + +class _LoopShutdownHandler: + def __init__(self, loop): + self._ioloop = loop + + def __call__(self, *args, **argv): + loop = self._ioloop + deadline = time() + 3 + + def stop(): + now = time() + if now < deadline and (loop._callbacks or loop._timeouts): + loop.add_timeout(now + 1, stop) + else: + loop.stop() + stop()