diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index 16b3df91..d19e7457 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -96,7 +96,7 @@ class Arbiter(object): sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) sock.bind(address) - sock.listen(64) + sock.listen(2048) return sock def run(self): diff --git a/gunicorn/worker.py b/gunicorn/worker.py index 47e2a87e..73cc2d67 100644 --- a/gunicorn/worker.py +++ b/gunicorn/worker.py @@ -1,9 +1,10 @@ -import BaseHTTPServer +import errno import logging import os import select import signal +import socket import http import util @@ -36,15 +37,23 @@ class Worker(object): if ret[0]: break - (conn, addr) = self.socket.accept() - log.info("Client connected: %s:%s" % addr) - conn.setblocking(1) - try: - self.handle(conn, addr) - except: - log.exception("Error processing request.") - finally: - conn.close() + # Accept until we hit EAGAIN + while True: + try: + (conn, addr) = self.socket.accept() + except socket.error, e: + if e[0] in [errno.EAGAIN, errno.EINTR]: + continue # Jump back to select + raise # Uh oh! + + #log.info("Client connected: %s:%s" % addr) + conn.setblocking(1) + try: + self.handle(conn, addr) + except: + log.exception("Error processing request.") + finally: + conn.close() def handle(self, conn, client): while True: