diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index 2ad74c80..6223504a 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -139,9 +139,12 @@ class Arbiter(object): self.manage_workers() while True: try: + self.reap_workers() sig = self.SIG_QUEUE.pop(0) if len(self.SIG_QUEUE) else None if sig is None: self.sleep() + self.murder_workers() + self.manage_workers() continue if sig not in self.SIG_NAMES: @@ -156,9 +159,8 @@ class Arbiter(object): log.info("Handling signal: %s" % signame) handler() - self.reap_workers() - self.murder_workers() - self.manage_workers() + + except StopIteration: break except KeyboardInterrupt: @@ -255,8 +257,8 @@ class Arbiter(object): def murder_workers(self): for (pid, worker) in list(self.WORKERS.items()): - diff = time.time() - os.fstat(worker.tmp.fileno()).st_mtime - if diff < self.timeout: + diff = time.time() - os.fstat(worker.tmp.fileno()).st_ctime + if diff <= self.timeout: continue self.kill_worker(pid, signal.SIGKILL) diff --git a/gunicorn/worker.py b/gunicorn/worker.py index 28d37aa2..6f7b3f4f 100644 --- a/gunicorn/worker.py +++ b/gunicorn/worker.py @@ -91,10 +91,10 @@ class Worker(object): self.init_signals() spinner = 0 while self.alive: - spinner = (spinner+1) % 2 - self._fchmod(spinner) while self.alive: + spinner = (spinner+1) % 2 + self._fchmod(spinner) try: ret = select.select([self.socket], [], [], 2.0) if ret[0]: @@ -139,5 +139,3 @@ class Worker(object): self.log.exception("Error processing request. [%s]" % str(e)) msg = "HTTP/1.0 500 Internal Server Error\r\n\r\n" util.close(client) - - del client