mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
factor out duplicate gevent-based worker code
This commit is contained in:
parent
55de904e9d
commit
d6915942f7
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user