mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
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.
This commit is contained in:
parent
8014555636
commit
d09f85edf0
@ -61,7 +61,7 @@ Commonly Used Arguments
|
|||||||
|
|
||||||
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
|
||||||
tornado
|
tornado
|
||||||
|
|
||||||
There are various other parameters that affect user privileges, logging, etc.
|
There are various other parameters that affect user privileges, logging, etc.
|
||||||
|
|||||||
@ -18,16 +18,19 @@ import gunicorn
|
|||||||
from gunicorn.workers.async import AsyncWorker
|
from gunicorn.workers.async import AsyncWorker
|
||||||
from gunicorn.workers.base import Worker
|
from gunicorn.workers.base import Worker
|
||||||
|
|
||||||
BASE_WSGI_ENV = {'GATEWAY_INTERFACE': 'CGI/1.1',
|
VERSION = "gevent/%s gunicorn/%s" % (gevent.__version__, gunicorn.__version__)
|
||||||
'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):
|
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
|
@classmethod
|
||||||
def setup(cls):
|
def setup(cls):
|
||||||
@ -73,36 +76,28 @@ class GEventWorker(AsyncWorker):
|
|||||||
|
|
||||||
def cleanup(self, gt):
|
def cleanup(self, gt):
|
||||||
try:
|
try:
|
||||||
try:
|
gt.join()
|
||||||
gt.join()
|
|
||||||
finally:
|
|
||||||
gt._conn.close()
|
|
||||||
except greenlet.GreenletExit:
|
except greenlet.GreenletExit:
|
||||||
pass
|
pass
|
||||||
except Exception:
|
except Exception:
|
||||||
self.log.exception("Unhandled exception in worker.")
|
self.log.exception("Unhandled exception in worker.")
|
||||||
|
finally:
|
||||||
|
gt._conn.close()
|
||||||
|
|
||||||
|
class GeventBaseWorker(Worker):
|
||||||
class WSGIHandler(wsgi.WSGIHandler):
|
"""\
|
||||||
def log_request(self, *args):
|
This base class is used for the two variants of workers that use
|
||||||
pass
|
Gevent's two different WSGI workers. ``gevent_wsgi`` worker uses
|
||||||
|
the libevent HTTP parser but does not support streaming response
|
||||||
class PyWSGIHandler(pywsgi.WSGIHandler):
|
bodies or Keep-Alive. The ``gevent_pywsgi`` worker uses an
|
||||||
def log_request(self, *args):
|
alternative Gevent WSGI server that supports streaming and Keep-
|
||||||
pass
|
Alive but does not use the libevent HTTP parser.
|
||||||
|
"""
|
||||||
class PyWSGIServer(pywsgi.WSGIServer):
|
server_class = None
|
||||||
base_env = BASE_WSGI_ENV
|
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):
|
def __init__(self, *args, **kwargs):
|
||||||
super(GEventWSGIWorker, self).__init__(*args, **kwargs)
|
super(GeventBaseWorker, self).__init__(*args, **kwargs)
|
||||||
self.worker_connections = self.cfg.worker_connections
|
self.worker_connections = self.cfg.worker_connections
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -132,6 +127,28 @@ class GEventWSGIWorker(Worker):
|
|||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
pass
|
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
|
server_class = PyWSGIServer
|
||||||
wsgi_handler = PyWSGIHandler
|
wsgi_handler = PyWSGIHandler
|
||||||
|
|||||||
6
setup.py
6
setup.py
@ -53,9 +53,9 @@ setup(
|
|||||||
[gunicorn.workers]
|
[gunicorn.workers]
|
||||||
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:GeventWSGIWorker
|
||||||
gevent_pywsgi=gunicorn.workers.ggevent:GEventPyWSGIWorker
|
gevent_pywsgi=gunicorn.workers.ggevent:GeventPyWSGIWorker
|
||||||
tornado=gunicorn.workers.gtornado:TornadoWorker
|
tornado=gunicorn.workers.gtornado:TornadoWorker
|
||||||
|
|
||||||
[paste.server_runner]
|
[paste.server_runner]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user