factor out duplicate gevent-based worker code

This commit is contained in:
Randall Leeds 2011-09-18 03:06:29 -07:00
parent 55de904e9d
commit d6915942f7
2 changed files with 11 additions and 80 deletions

View File

@ -37,19 +37,6 @@ BASE_WSGI_ENV = {
'wsgi.run_once': False
}
class GGeventServer(StreamServer):
def __init__(self, listener, handle, spawn='default', worker=None):
StreamServer.__init__(self, listener, spawn=spawn)
self.handle_func = handle
self.worker = worker
def stop(self, timeout=None):
super(GGeventServer, self).stop(timeout=timeout)
def handle(self, sock, addr):
self.handle_func(sock, addr)
class GeventWorker(AsyncWorker):
@classmethod
@ -66,8 +53,12 @@ class GeventWorker(AsyncWorker):
self.socket.setblocking(1)
pool = Pool(self.worker_connections)
server = GGeventServer(self.socket, self.handle, spawn=pool,
worker=self)
if hasattr(self, 'server_class'):
server = self.server_class(
self.socket, application=self.wsgi, spawn=pool, log=self.log,
handler_class=self.wsgi_handler)
else:
server = StreamServer(self.socket, handle=self.handle, spawn=pool)
server.start()
try:
@ -104,68 +95,6 @@ class GeventWorker(AsyncWorker):
gevent.core.dns_init()
super(GeventWorker, self).init_process()
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
def __init__(self, *args, **kwargs):
super(GeventBaseWorker, self).__init__(*args, **kwargs)
self.worker_connections = self.cfg.worker_connections
@classmethod
def setup(cls):
from gevent import monkey
monkey.noisy = False
monkey.patch_all()
def run(self):
self.socket.setblocking(1)
pool = Pool(self.worker_connections)
self.server_class.base_env['wsgi.multiprocess'] = (self.cfg.workers > 1)
server = self.server_class(
self.socket, application=self.wsgi, spawn=pool, log=self.log,
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)
break
gevent.sleep(1.0)
except KeyboardInterrupt:
pass
# try to stop the connections
try:
self.notify()
server.stop(timeout=self.timeout)
except:
pass
if hasattr(gevent.core, 'dns_shutdown'):
def init_process(self):
#gevent 0.13 and older 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()
class PyWSGIHandler(pywsgi.WSGIHandler):
def log_request(self):
@ -183,7 +112,7 @@ class PyWSGIHandler(pywsgi.WSGIHandler):
class PyWSGIServer(pywsgi.WSGIServer):
base_env = BASE_WSGI_ENV
class GeventPyWSGIWorker(GeventBaseWorker):
class GeventPyWSGIWorker(GeventWorker):
"The Gevent StreamServer based workers."
server_class = PyWSGIServer
wsgi_handler = PyWSGIHandler

View File

@ -3,7 +3,9 @@
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.workers.ggevent import BASE_WSGI_ENV, GeventBaseWorker
from datetime import datetime
from gunicorn.workers.ggevent import BASE_WSGI_ENV, GeventWorker
from gevent import wsgi
@ -32,7 +34,7 @@ class WSGIHandler(wsgi.WSGIHandler):
class WSGIServer(wsgi.WSGIServer):
base_env = BASE_WSGI_ENV
class GeventWSGIWorker(GeventBaseWorker):
class GeventWSGIWorker(GeventWorker):
"The Gevent StreamServer based workers."
server_class = WSGIServer
wsgi_handler = WSGIHandler