From f2920bfcdaa34c9ec98c47dbb4c63816cd3a580a Mon Sep 17 00:00:00 2001 From: benoitc Date: Mon, 4 Nov 2013 14:26:05 +0100 Subject: [PATCH] monkey patch in the worker this change move the monkey patching from the aribiter to the worker so we make sure the supervision won't be altered. fix #478 --- gunicorn/workers/geventlet.py | 17 ++++++++++++----- gunicorn/workers/ggevent.py | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/gunicorn/workers/geventlet.py b/gunicorn/workers/geventlet.py index 5c87c8cf..a2448592 100644 --- a/gunicorn/workers/geventlet.py +++ b/gunicorn/workers/geventlet.py @@ -10,6 +10,12 @@ try: import eventlet except ImportError: raise RuntimeError("You need eventlet installed to use this worker.") + +# validate the eventlet version +if eventlet.version_info < (0, 9, 7): + raise RuntimeError("You need eventlet >= 0.9.7") + + from eventlet import hubs from eventlet.greenio import GreenSocket from eventlet.hubs import trampoline @@ -35,11 +41,7 @@ def patch_sendfile(): class EventletWorker(AsyncWorker): - @classmethod - def setup(cls): - import eventlet - if eventlet.version_info < (0, 9, 7): - raise RuntimeError("You need eventlet >= 0.9.7") + def patch(self): eventlet.monkey_patch(os=False) patch_sendfile() @@ -84,3 +86,8 @@ class EventletWorker(AsyncWorker): if te != t: raise [a.kill() for a in acceptors] + + def init_process(self): + # monkey patch here + self.patch() + super(EventletWorker, self).init_process() diff --git a/gunicorn/workers/ggevent.py b/gunicorn/workers/ggevent.py index 0c00f53f..60aba6c2 100644 --- a/gunicorn/workers/ggevent.py +++ b/gunicorn/workers/ggevent.py @@ -63,8 +63,7 @@ class GeventWorker(AsyncWorker): server_class = None wsgi_handler = None - @classmethod - def setup(cls): + def patch(cls): from gevent import monkey monkey.noisy = False monkey.patch_all() @@ -157,6 +156,9 @@ class GeventWorker(AsyncWorker): if gevent.version_info[0] == 0: def init_process(self): + # monkey patch here + self.patch() + #gevent 0.13 and older doesn't reinitialize dns for us after forking #here's the workaround import gevent.core @@ -164,6 +166,14 @@ class GeventWorker(AsyncWorker): gevent.core.dns_init() super(GeventWorker, self).init_process() + else: + + def init_process(self): + # monkey patch here + self.patch() + # then initialize the process + super(GeventWorker, self).init_process() + class GeventResponse(object):