From d09f85edf080877b53602bd10d4a8da0a91850fc Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 14 Jul 2010 18:27:35 -0400 Subject: [PATCH] Minor tweaks to new Gevent workers. Just a slight rearangement and added some docs so I can remember which worker is which in the future. Also renamed all occurrences of GEvent to Gevent to have consistency. --- README.rst | 2 +- gunicorn/workers/ggevent.py | 83 ++++++++++++++++++++++--------------- setup.py | 6 +-- 3 files changed, 54 insertions(+), 37 deletions(-) diff --git a/README.rst b/README.rst index f0c29661..18b6d7a4 100644 --- a/README.rst +++ b/README.rst @@ -61,7 +61,7 @@ Commonly Used Arguments sync=gunicorn.workers.sync:SyncWorker eventlet=gunicorn.workers.geventlet:EventletWorker - gevent=gunicorn.workers.ggevent:GEventWorker + gevent=gunicorn.workers.ggevent:GeventWorker tornado There are various other parameters that affect user privileges, logging, etc. diff --git a/gunicorn/workers/ggevent.py b/gunicorn/workers/ggevent.py index 1d8f7c07..dd27cf29 100644 --- a/gunicorn/workers/ggevent.py +++ b/gunicorn/workers/ggevent.py @@ -18,16 +18,19 @@ import gunicorn from gunicorn.workers.async import AsyncWorker from gunicorn.workers.base import Worker -BASE_WSGI_ENV = {'GATEWAY_INTERFACE': 'CGI/1.1', - 'SERVER_SOFTWARE': 'gevent/%s gunicorn/%s' % (gevent.__version__, - gunicorn.__version__), - 'SCRIPT_NAME': '', - 'wsgi.version': (1, 0), - 'wsgi.multithread': False, - 'wsgi.multiprocess': False, - 'wsgi.run_once': False} +VERSION = "gevent/%s gunicorn/%s" % (gevent.__version__, gunicorn.__version__) -class GEventWorker(AsyncWorker): +BASE_WSGI_ENV = { + 'GATEWAY_INTERFACE': 'CGI/1.1', + 'SERVER_SOFTWARE': VERSION, + 'SCRIPT_NAME': '', + 'wsgi.version': (1, 0), + 'wsgi.multithread': False, + 'wsgi.multiprocess': False, + 'wsgi.run_once': False +} + +class GeventWorker(AsyncWorker): @classmethod def setup(cls): @@ -73,36 +76,28 @@ class GEventWorker(AsyncWorker): def cleanup(self, gt): try: - try: - gt.join() - finally: - gt._conn.close() + gt.join() except greenlet.GreenletExit: pass except Exception: self.log.exception("Unhandled exception in worker.") - + finally: + gt._conn.close() -class WSGIHandler(wsgi.WSGIHandler): - def log_request(self, *args): - pass - -class PyWSGIHandler(pywsgi.WSGIHandler): - def log_request(self, *args): - pass - -class PyWSGIServer(pywsgi.WSGIServer): - base_env = BASE_WSGI_ENV +class GeventBaseWorker(Worker): + """\ + This base class is used for the two variants of workers that use + Gevent's two different WSGI workers. ``gevent_wsgi`` worker uses + the libevent HTTP parser but does not support streaming response + bodies or Keep-Alive. The ``gevent_pywsgi`` worker uses an + alternative Gevent WSGI server that supports streaming and Keep- + Alive but does not use the libevent HTTP parser. + """ + server_class = None + wsgi_handler = None -class WSGIServer(wsgi.WSGIServer): - base_env = BASE_WSGI_ENV - -class GEventWSGIWorker(Worker): - server_class = WSGIServer - wsgi_handler = WSGIHandler - def __init__(self, *args, **kwargs): - super(GEventWSGIWorker, self).__init__(*args, **kwargs) + super(GeventBaseWorker, self).__init__(*args, **kwargs) self.worker_connections = self.cfg.worker_connections @classmethod @@ -132,6 +127,28 @@ class GEventWSGIWorker(Worker): except KeyboardInterrupt: pass -class GEventPyWSGIWorker(GEventWSGIWorker): + +class WSGIHandler(wsgi.WSGIHandler): + def log_request(self, *args): + pass + +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): + def log_request(self, *args): + pass + +class PyWSGIServer(pywsgi.WSGIServer): + base_env = BASE_WSGI_ENV + +class GeventPyWSGIWorker(GeventBaseWorker): + "The Gevent StreamServer based workers." server_class = PyWSGIServer wsgi_handler = PyWSGIHandler diff --git a/setup.py b/setup.py index d7269deb..dc13bf9e 100644 --- a/setup.py +++ b/setup.py @@ -53,9 +53,9 @@ setup( [gunicorn.workers] sync=gunicorn.workers.sync:SyncWorker eventlet=gunicorn.workers.geventlet:EventletWorker - gevent=gunicorn.workers.ggevent:GEventWorker - gevent_wsgi=gunicorn.workers.ggevent:GEventWSGIWorker - gevent_pywsgi=gunicorn.workers.ggevent:GEventPyWSGIWorker + gevent=gunicorn.workers.ggevent:GeventWorker + gevent_wsgi=gunicorn.workers.ggevent:GeventWSGIWorker + gevent_pywsgi=gunicorn.workers.ggevent:GeventPyWSGIWorker tornado=gunicorn.workers.gtornado:TornadoWorker [paste.server_runner]