fix compatibility with gevent 0.14 dev version

Move "import gevent.wsgi" into a separate module, which is not
imported if pywsgi worker is requested. (The gevent.wsgi currently
not provided by gevent trunk but pywsgi works fine.)
This commit is contained in:
denis 2011-05-11 17:22:58 +07:00 committed by benoitc
parent c74894f2a1
commit 2ab4bbf46f
3 changed files with 40 additions and 33 deletions

View File

@ -18,7 +18,7 @@ except ImportError:
raise RuntimeError("You need gevent installed to use this worker.")
from gevent.pool import Pool
from gevent.server import StreamServer
from gevent import pywsgi, wsgi
from gevent import pywsgi
import gunicorn
from gunicorn.workers.async import AsyncWorker
@ -94,12 +94,15 @@ class GeventWorker(AsyncWorker):
except gevent.GreenletExit:
pass
def init_process(self):
#gevent doesn't reinitialize dns for us after forking
#here's the workaround
gevent.core.dns_shutdown(fail_requests=1)
gevent.core.dns_init()
super(GeventWorker, self).init_process()
if hasattr(gevent.core, 'dns_shutdown'):
def init_process(self):
#gevent 0.13 and older doesn't reinitialize dns for us after forking
#here's the workaround
gevent.core.dns_shutdown(fail_requests=1)
gevent.core.dns_init()
super(GeventWorker, self).init_process()
class GeventBaseWorker(Worker):
"""\
@ -151,32 +154,14 @@ class GeventBaseWorker(Worker):
except:
pass
def init_process(self):
#gevent doesn't reinitialize dns for us after forking
#here's the workaround
gevent.core.dns_shutdown(fail_requests=1)
gevent.core.dns_init()
super(GeventBaseWorker, self).init_process()
if hasattr(gevent.core, 'dns_shutdown'):
class WSGIHandler(wsgi.WSGIHandler):
def log_request(self, *args):
pass
def prepare_env(self):
env = super(WSGIHandler, self).prepare_env()
env['RAW_URI'] = self.request.uri
return env
class WSGIServer(wsgi.WSGIServer):
base_env = BASE_WSGI_ENV
class GeventWSGIWorker(GeventBaseWorker):
"The libevent HTTP based workers"
server_class = WSGIServer
wsgi_handler = WSGIHandler
def init_process(self):
#gevent 0.13 and older doesn't reinitialize dns for us after forking
#here's the workaround
gevent.core.dns_shutdown(fail_requests=1)
gevent.core.dns_init()
super(GeventBaseWorker, self).init_process()
class PyWSGIHandler(pywsgi.WSGIHandler):

View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 -
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from __future__ import with_statement
from gunicorn.worker.ggevent import *
from gevent import wsgi
class WSGIHandler(wsgi.WSGIHandler):
def log_request(self, *args):
pass
def prepare_env(self):
env = super(WSGIHandler, self).prepare_env()
env['RAW_URI'] = self.request.uri
return env
class WSGIServer(wsgi.WSGIServer):
base_env = BASE_WSGI_ENV

View File

@ -57,7 +57,7 @@ setup(
sync=gunicorn.workers.sync:SyncWorker
eventlet=gunicorn.workers.geventlet:EventletWorker
gevent=gunicorn.workers.ggevent:GeventWorker
gevent_wsgi=gunicorn.workers.ggevent:GeventWSGIWorker
gevent_wsgi=gunicorn.workers.ggevent_wsgi:GeventWSGIWorker
gevent_pywsgi=gunicorn.workers.ggevent:GeventPyWSGIWorker
tornado=gunicorn.workers.gtornado:TornadoWorker