some fixes

This commit is contained in:
benoitc 2010-08-12 11:30:07 +02:00
parent bf9d48be68
commit ed66b8b129
4 changed files with 15 additions and 10 deletions

View File

@ -3,6 +3,7 @@
# This file is part of gunicorn released under the MIT license. # This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information. # See the NOTICE for more information.
import errno
import logging import logging
import os import os
import sys import sys

View File

@ -44,8 +44,6 @@ def create(req, sock, client, server, cfg):
forward = client forward = client
url_scheme = "http" url_scheme = "http"
script_name = os.environ.get("SCRIPT_NAME", "") script_name = os.environ.get("SCRIPT_NAME", "")
content_type = ""
content_length = ""
for hdr_name, hdr_value in req.headers: for hdr_name, hdr_value in req.headers:
if hdr_name == "EXPECT": if hdr_name == "EXPECT":

View File

@ -16,6 +16,8 @@ from eventlet import greenlet
from eventlet import greenpool from eventlet import greenpool
from eventlet import greenthread from eventlet import greenthread
from eventlet import hubs from eventlet import hubs
from eventlet.greenio import GreenSocket
from gunicorn.workers.async import AsyncWorker from gunicorn.workers.async import AsyncWorker
from gunicorn import util from gunicorn import util
@ -38,11 +40,12 @@ class EventletWorker(AsyncWorker):
return eventlet.Timeout(self.cfg.keepalive, False) return eventlet.Timeout(self.cfg.keepalive, False)
def run(self): def run(self):
self.socket = GreenSocket(family_or_realsock=self.socket.sock)
self.socket.setblocking(1) self.socket.setblocking(1)
pool = greenpool.GreenPool(self.worker_connections) pool = greenpool.GreenPool(self.worker_connections)
acceptor = eventlet.spawn(self.acceptor, pool) acceptor = eventlet.spawn(self.acceptor, pool)
try: try:
while self.alive: while self.alive:
self.notify() self.notify()
@ -56,15 +59,19 @@ class EventletWorker(AsyncWorker):
pass pass
# we stopped # we stopped
eventlet.kill(acceptor, eventlet.StopServe)
with eventlet.Timeout(self.timeout, False): with eventlet.Timeout(self.timeout, False):
if pool.waiting(): eventlet.kill(acceptor, eventlet.StopServe)
pool.waitall()
def acceptor(self, pool): def acceptor(self, pool):
acceptor_gt = greenthread.getcurrent() acceptor_gt = greenthread.getcurrent()
while self.alive: while self.alive:
# pool is full ?
if pool.running() > self.worker_connections:
continue
try: try:
try: try:
conn, addr = self.socket.accept() conn, addr = self.socket.accept()
@ -73,6 +80,7 @@ class EventletWorker(AsyncWorker):
sys.exc_clear() sys.exc_clear()
return return
raise raise
gt = pool.spawn(self.handle, conn, addr) gt = pool.spawn(self.handle, conn, addr)
gt.link(self._stop_acceptor, acceptor_gt, conn) gt.link(self._stop_acceptor, acceptor_gt, conn)
conn, addr, gt = None, None, None conn, addr, gt = None, None, None
@ -81,9 +89,10 @@ class EventletWorker(AsyncWorker):
self.alive = False self.alive = False
break break
except eventlet.StopServe: except eventlet.StopServe:
if pool.waiting():
pool.waitall()
break break
except: except:
self.log.exception("Unexpected error in acceptor. Sepuku.") self.log.exception("Unexpected error in acceptor. Sepuku.")
os._exit(4) os._exit(4)

View File

@ -5,10 +5,7 @@
from __future__ import with_statement from __future__ import with_statement
import errno
import os import os
import socket
import sys
import gevent import gevent
from gevent import monkey from gevent import monkey