diff --git a/gunicorn/workers/ggevent.py b/gunicorn/workers/ggevent.py index c80b1ea8..1d8f7c07 100644 --- a/gunicorn/workers/ggevent.py +++ b/gunicorn/workers/ggevent.py @@ -12,8 +12,20 @@ from gevent import monkey monkey.noisy = False from gevent import greenlet from gevent.pool import Pool +from gevent import pywsgi, wsgi +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} class GEventWorker(AsyncWorker): @@ -69,3 +81,57 @@ class GEventWorker(AsyncWorker): pass except Exception: self.log.exception("Unhandled exception in worker.") + + +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 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) + self.worker_connections = self.cfg.worker_connections + + @classmethod + def setup(cls): + from gevent import monkey + monkey.patch_all(dns=False) + + def run(self): + self.socket.setblocking(1) + pool = Pool(self.worker_connections) + + server = self.server_class(self.socket, application=self.wsgi, + spawn=pool, handler_class=self.wsgi_handler) + + server.start() + + try: + while self.alive: + self.notify() + + if self.ppid != os.getppid(): + self.log.info("Parent changed, shutting down: %s" % self) + server.stop() + break + gevent.sleep(0.1) + self.pool.join(timeout=self.timeout) + except KeyboardInterrupt: + pass + +class GEventPyWSGIWorker(GEventWSGIWorker): + server_class = PyWSGIServer + wsgi_handler = PyWSGIHandler diff --git a/gunicorn/workers/ggevent2.py b/gunicorn/workers/ggevent2.py deleted file mode 100644 index c5545e9a..00000000 --- a/gunicorn/workers/ggevent2.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 - -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import os - -import gevent -from gevent import core -from gevent import monkey -monkey.noisy = False -from gevent.pool import Pool -from gevent import pywsgi - -import gunicorn -from gunicorn.workers.base import Worker - -class WSGIHandler(pywsgi.WSGIHandler): - def log_request(self, *args): - pass - - -class WSGIServer(pywsgi.WSGIServer): - base_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} - - - -class GEvent2Worker(Worker): - - - def __init__(self, *args, **kwargs): - super(GEvent2Worker, self).__init__(*args, **kwargs) - self.worker_connections = self.cfg.worker_connections - - @classmethod - def setup(cls): - from gevent import monkey - monkey.patch_all(dns=False) - - def run(self): - self.socket.setblocking(1) - pool = Pool(self.worker_connections) - - server = WSGIServer(self.socket, application=self.wsgi, - spawn=pool, handler_class=WSGIHandler) - - server.start() - - try: - while self.alive: - self.notify() - - if self.ppid != os.getppid(): - self.log.info("Parent changed, shutting down: %s" % self) - server.stop() - break - gevent.sleep(0.1) - self.pool.join(timeout=self.timeout) - except KeyboardInterrupt: - pass - - - - - diff --git a/setup.py b/setup.py index 872a5637..d7269deb 100644 --- a/setup.py +++ b/setup.py @@ -54,7 +54,8 @@ setup( sync=gunicorn.workers.sync:SyncWorker eventlet=gunicorn.workers.geventlet:EventletWorker gevent=gunicorn.workers.ggevent:GEventWorker - gevent2=gunicorn.workers.ggevent2:GEvent2Worker + gevent_wsgi=gunicorn.workers.ggevent:GEventWSGIWorker + gevent_pywsgi=gunicorn.workers.ggevent:GEventPyWSGIWorker tornado=gunicorn.workers.gtornado:TornadoWorker [paste.server_runner]