diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index cd3466c9..b35357f3 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -308,8 +308,15 @@ class Arbiter(object): Sleep until PIPE is readable or we timeout. A readable PIPE means a signal occurred. """ + if self.WORKERS: + oldest = min(w.tmp.last_update() for w in self.WORKERS.values()) + timeout = self.timeout - (time.time() - oldest) + # The timeout can be reached, so don't wait for a negative value + timeout = max(timeout, 1.0) + else: + timeout = 1.0 try: - ready = select.select([self.PIPE[0]], [], [], 1.0) + ready = select.select([self.PIPE[0]], [], [], timeout) if not ready[0]: return while os.read(self.PIPE[0], 1):