From 2e39db265c8c69c445cdb2cef52988016b5f5d1d Mon Sep 17 00:00:00 2001 From: benoitc Date: Sun, 12 Dec 2010 22:57:50 +0100 Subject: [PATCH] rather than sleeping the timeout, just test if time is elapsed, then notify. Speed graceful reload and exit. --- gunicorn/workers/geventlet.py | 11 +++++++++-- gunicorn/workers/ggevent.py | 21 +++++++++++++++++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/gunicorn/workers/geventlet.py b/gunicorn/workers/geventlet.py index 970abece..72e3d834 100644 --- a/gunicorn/workers/geventlet.py +++ b/gunicorn/workers/geventlet.py @@ -7,6 +7,8 @@ from __future__ import with_statement import os +import time + try: import eventlet except ImportError: @@ -38,12 +40,17 @@ class EventletWorker(AsyncWorker): self.acceptor = eventlet.spawn(eventlet.serve, self.socket, self.handle, self.worker_connections) + t = time.time() while self.alive: - self.notify() + if time.time() >= t: + self.notify() + t = time.time() + self.timeout + if self.ppid != os.getppid(): self.log.info("Parent changed, shutting down: %s" % self) break - eventlet.sleep(self.timeout) + + eventlet.sleep(0.1) self.notify() with eventlet.Timeout(self.timeout, False): diff --git a/gunicorn/workers/ggevent.py b/gunicorn/workers/ggevent.py index 2407fd20..a26309e3 100644 --- a/gunicorn/workers/ggevent.py +++ b/gunicorn/workers/ggevent.py @@ -7,6 +7,7 @@ from __future__ import with_statement import os import sys +import time # workaround on osx, disable kqueue if sys.platform == "darwin": @@ -72,13 +73,19 @@ class GeventWorker(AsyncWorker): worker=self) server.start() + t = time.time() try: while self.alive: - self.notify() + + if time.time() >= t: + self.notify() + t = time.time() + self.timeout + if self.ppid != os.getppid(): self.log.info("Parent changed, shutting down: %s" % self) break - gevent.sleep(self.timeout) + gevent.sleep(0.1) + except KeyboardInterrupt: pass @@ -131,14 +138,20 @@ class GeventBaseWorker(Worker): server = self.server_class(self.socket, application=self.wsgi, spawn=pool, handler_class=self.wsgi_handler) server.start() + + t = time.time() try: while self.alive: - self.notify() + if time.time() >= t: + self.notify() + t = time.time() + self.timeout if self.ppid != os.getppid(): self.log.info("Parent changed, shutting down: %s" % self) break - gevent.sleep(self.timeout) + + # sleep + gevent.sleep(0.1) except KeyboardInterrupt: pass