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,12 +94,15 @@ class GeventWorker(AsyncWorker):
except gevent.GreenletExit: except gevent.GreenletExit:
pass pass
def init_process(self): if hasattr(gevent.core, 'dns_shutdown'):
#gevent doesn't reinitialize dns for us after forking
#here's the workaround def init_process(self):
gevent.core.dns_shutdown(fail_requests=1) #gevent 0.13 and older doesn't reinitialize dns for us after forking
gevent.core.dns_init() #here's the workaround
super(GeventWorker, self).init_process() gevent.core.dns_shutdown(fail_requests=1)
gevent.core.dns_init()
super(GeventWorker, self).init_process()
class GeventBaseWorker(Worker): class GeventBaseWorker(Worker):
"""\ """\
@ -151,32 +154,14 @@ class GeventBaseWorker(Worker):
except: except:
pass pass
def init_process(self): if hasattr(gevent.core, 'dns_shutdown'):
#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()
def init_process(self):
#gevent 0.13 and older doesn't reinitialize dns for us after forking
class WSGIHandler(wsgi.WSGIHandler): #here's the workaround
def log_request(self, *args): gevent.core.dns_shutdown(fail_requests=1)
pass gevent.core.dns_init()
super(GeventBaseWorker, self).init_process()
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):

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