From b281ec002b3c95aa27f492f6c364390b14e5d09e Mon Sep 17 00:00:00 2001 From: benoitc Date: Thu, 12 Aug 2010 13:10:56 +0200 Subject: [PATCH] fix worker timeout. --- gunicorn/workers/geventlet.py | 68 +++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/gunicorn/workers/geventlet.py b/gunicorn/workers/geventlet.py index 02f4ff91..27f04369 100644 --- a/gunicorn/workers/geventlet.py +++ b/gunicorn/workers/geventlet.py @@ -7,20 +7,15 @@ from __future__ import with_statement import errno import socket -import sys import eventlet - from eventlet.green import os -from eventlet import greenlet -from eventlet import greenpool -from eventlet import greenthread from eventlet import hubs from eventlet.greenio import GreenSocket from gunicorn.workers.async import AsyncWorker -from gunicorn import util + class EventletWorker(AsyncWorker): @@ -39,36 +34,47 @@ class EventletWorker(AsyncWorker): def timeout_ctx(self): return eventlet.Timeout(self.cfg.keepalive, False) - + def acceptor(self, pool): + try: + while self.alive: + try: + client, addr = self.socket.accept() + pool.spawn_n(self.handle, client, addr) + except socket.error, e: + if e[0] not in (errno.EAGAIN, errno.ECONNABORTED): + raise + + if pool.running() > self.worker_connections: + continue + + try: + hubs.trampoline(self.socket.fileno(), read=True, + timeout=self.timeout) + except eventlet.Timeout: + pass + except eventlet.StopServer: + pool.waitall() + def run(self): self.socket = GreenSocket(family_or_realsock=self.socket.sock) self.socket.setblocking(1) pool = eventlet.GreenPool(self.worker_connections) - while self.alive: - self.notify() + acceptor = eventlet.spawn(self.acceptor, pool) - try: - client, addr = self.socket.accept() - client.setblocking(1) - util.close_on_exec(client) - pool.spawn_n(self.handle, client, addr) - except socket.error, e: - if e[0] not in (errno.EAGAIN, errno.ECONNABORTED): - raise - - if pool.running() > self.worker_connections: - continue - - if self.ppid != os.getppid(): - self.log.info("Parent changed, shutting down: %s" % self) - break - - self.notify() + try: + while self.alive: + self.notify() - try: - hubs.trampoline(self.socket.fileno(), read=True, - timeout=self.timeout) - except eventlet.Timeout: - pass + if self.ppid != os.getppid(): + self.log.info("Parent changed, shutting down: %s" % self) + server.stop() + break + eventlet.sleep(0.1) + except KeyboardInterrupt: + pass + + with eventlet.Timeout(self.timeout, False): + eventlet.kill(acceptor, eventlet.StopServe) +