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.") raise RuntimeError("You need gevent installed to use this worker.")
from gevent.pool import Pool from gevent.pool import Pool
from gevent.server import StreamServer from gevent.server import StreamServer
from gevent import pywsgi, wsgi from gevent import pywsgi
import gunicorn import gunicorn
from gunicorn.workers.async import AsyncWorker from gunicorn.workers.async import AsyncWorker
@ -94,13 +94,16 @@ class GeventWorker(AsyncWorker):
except gevent.GreenletExit: except gevent.GreenletExit:
pass pass
if hasattr(gevent.core, 'dns_shutdown'):
def init_process(self): def init_process(self):
#gevent doesn't reinitialize dns for us after forking #gevent 0.13 and older doesn't reinitialize dns for us after forking
#here's the workaround #here's the workaround
gevent.core.dns_shutdown(fail_requests=1) gevent.core.dns_shutdown(fail_requests=1)
gevent.core.dns_init() gevent.core.dns_init()
super(GeventWorker, self).init_process() super(GeventWorker, self).init_process()
class GeventBaseWorker(Worker): class GeventBaseWorker(Worker):
"""\ """\
This base class is used for the two variants of workers that use This base class is used for the two variants of workers that use
@ -151,34 +154,16 @@ class GeventBaseWorker(Worker):
except: except:
pass pass
if hasattr(gevent.core, 'dns_shutdown'):
def init_process(self): def init_process(self):
#gevent doesn't reinitialize dns for us after forking #gevent 0.13 and older doesn't reinitialize dns for us after forking
#here's the workaround #here's the workaround
gevent.core.dns_shutdown(fail_requests=1) gevent.core.dns_shutdown(fail_requests=1)
gevent.core.dns_init() gevent.core.dns_init()
super(GeventBaseWorker, self).init_process() super(GeventBaseWorker, self).init_process()
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
class PyWSGIHandler(pywsgi.WSGIHandler): class PyWSGIHandler(pywsgi.WSGIHandler):
def log_request(self, *args): def log_request(self, *args):
pass pass

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 sync=gunicorn.workers.sync:SyncWorker
eventlet=gunicorn.workers.geventlet:EventletWorker eventlet=gunicorn.workers.geventlet:EventletWorker
gevent=gunicorn.workers.ggevent:GeventWorker gevent=gunicorn.workers.ggevent:GeventWorker
gevent_wsgi=gunicorn.workers.ggevent:GeventWSGIWorker gevent_wsgi=gunicorn.workers.ggevent_wsgi:GeventWSGIWorker
gevent_pywsgi=gunicorn.workers.ggevent:GeventPyWSGIWorker gevent_pywsgi=gunicorn.workers.ggevent:GeventPyWSGIWorker
tornado=gunicorn.workers.gtornado:TornadoWorker tornado=gunicorn.workers.gtornado:TornadoWorker