mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
Merge branch 'fix/478' into develop
This commit is contained in:
commit
f47262c5ae
@ -3,6 +3,6 @@
|
|||||||
# This file is part of gunicorn released under the MIT license.
|
# This file is part of gunicorn released under the MIT license.
|
||||||
# See the NOTICE for more information.
|
# See the NOTICE for more information.
|
||||||
|
|
||||||
version_info = (18, 0)
|
version_info = (18, 1)
|
||||||
__version__ = ".".join([str(v) for v in version_info])
|
__version__ = ".".join([str(v) for v in version_info])
|
||||||
SERVER_SOFTWARE = "gunicorn/%s" % __version__
|
SERVER_SOFTWARE = "gunicorn/%s" % __version__
|
||||||
|
|||||||
@ -10,6 +10,12 @@ try:
|
|||||||
import eventlet
|
import eventlet
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise RuntimeError("You need eventlet installed to use this worker.")
|
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 import hubs
|
||||||
from eventlet.greenio import GreenSocket
|
from eventlet.greenio import GreenSocket
|
||||||
from eventlet.hubs import trampoline
|
from eventlet.hubs import trampoline
|
||||||
@ -35,11 +41,7 @@ def patch_sendfile():
|
|||||||
|
|
||||||
class EventletWorker(AsyncWorker):
|
class EventletWorker(AsyncWorker):
|
||||||
|
|
||||||
@classmethod
|
def patch(self):
|
||||||
def setup(cls):
|
|
||||||
import eventlet
|
|
||||||
if eventlet.version_info < (0, 9, 7):
|
|
||||||
raise RuntimeError("You need eventlet >= 0.9.7")
|
|
||||||
eventlet.monkey_patch(os=False)
|
eventlet.monkey_patch(os=False)
|
||||||
patch_sendfile()
|
patch_sendfile()
|
||||||
|
|
||||||
@ -64,6 +66,7 @@ class EventletWorker(AsyncWorker):
|
|||||||
def run(self):
|
def run(self):
|
||||||
acceptors = []
|
acceptors = []
|
||||||
for sock in self.sockets:
|
for sock in self.sockets:
|
||||||
|
sock = GreenSocket(sock)
|
||||||
sock.setblocking(1)
|
sock.setblocking(1)
|
||||||
hfun = partial(self.handle, sock)
|
hfun = partial(self.handle, sock)
|
||||||
acceptor = eventlet.spawn(eventlet.serve, sock, hfun,
|
acceptor = eventlet.spawn(eventlet.serve, sock, hfun,
|
||||||
@ -84,3 +87,8 @@ class EventletWorker(AsyncWorker):
|
|||||||
if te != t:
|
if te != t:
|
||||||
raise
|
raise
|
||||||
[a.kill() for a in acceptors]
|
[a.kill() for a in acceptors]
|
||||||
|
|
||||||
|
def init_process(self):
|
||||||
|
# monkey patch here
|
||||||
|
self.patch()
|
||||||
|
super(EventletWorker, self).init_process()
|
||||||
|
|||||||
@ -12,6 +12,8 @@ from datetime import datetime
|
|||||||
from functools import partial
|
from functools import partial
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
_socket = __import__("socket")
|
||||||
|
|
||||||
# workaround on osx, disable kqueue
|
# workaround on osx, disable kqueue
|
||||||
if sys.platform == "darwin":
|
if sys.platform == "darwin":
|
||||||
os.environ['EVENT_NOKQUEUE'] = "1"
|
os.environ['EVENT_NOKQUEUE'] = "1"
|
||||||
@ -22,7 +24,7 @@ except ImportError:
|
|||||||
raise RuntimeError("You need gevent installed to use this worker.")
|
raise RuntimeError("You need gevent installed to use this worker.")
|
||||||
from gevent.pool import Pool
|
from gevent.pool import Pool
|
||||||
from gevent.server import StreamServer
|
from gevent.server import StreamServer
|
||||||
from gevent.socket import wait_write
|
from gevent.socket import wait_write, socket
|
||||||
from gevent import pywsgi
|
from gevent import pywsgi
|
||||||
|
|
||||||
import gunicorn
|
import gunicorn
|
||||||
@ -63,15 +65,27 @@ class GeventWorker(AsyncWorker):
|
|||||||
server_class = None
|
server_class = None
|
||||||
wsgi_handler = None
|
wsgi_handler = None
|
||||||
|
|
||||||
@classmethod
|
def patch(self):
|
||||||
def setup(cls):
|
|
||||||
from gevent import monkey
|
from gevent import monkey
|
||||||
monkey.noisy = False
|
monkey.noisy = False
|
||||||
monkey.patch_all()
|
|
||||||
|
# if the new version is used make sure to patch subprocess
|
||||||
|
if gevent.version_info[0] == 0:
|
||||||
|
monkey.patch_all()
|
||||||
|
else:
|
||||||
|
monkey.patch_all(subprocess=True)
|
||||||
|
|
||||||
# monkey patch sendfile to make it none blocking
|
# monkey patch sendfile to make it none blocking
|
||||||
patch_sendfile()
|
patch_sendfile()
|
||||||
|
|
||||||
|
# patch sockets
|
||||||
|
sockets = []
|
||||||
|
for s in self.sockets:
|
||||||
|
sockets.append(socket(s.FAMILY, _socket.SOCK_STREAM,
|
||||||
|
_sock=s))
|
||||||
|
self.sockets = sockets
|
||||||
|
|
||||||
|
|
||||||
def notify(self):
|
def notify(self):
|
||||||
super(GeventWorker, self).notify()
|
super(GeventWorker, self).notify()
|
||||||
if self.ppid != os.getppid():
|
if self.ppid != os.getppid():
|
||||||
@ -157,6 +171,9 @@ class GeventWorker(AsyncWorker):
|
|||||||
if gevent.version_info[0] == 0:
|
if gevent.version_info[0] == 0:
|
||||||
|
|
||||||
def init_process(self):
|
def init_process(self):
|
||||||
|
# monkey patch here
|
||||||
|
self.patch()
|
||||||
|
|
||||||
#gevent 0.13 and older doesn't reinitialize dns for us after forking
|
#gevent 0.13 and older doesn't reinitialize dns for us after forking
|
||||||
#here's the workaround
|
#here's the workaround
|
||||||
import gevent.core
|
import gevent.core
|
||||||
@ -164,6 +181,19 @@ class GeventWorker(AsyncWorker):
|
|||||||
gevent.core.dns_init()
|
gevent.core.dns_init()
|
||||||
super(GeventWorker, self).init_process()
|
super(GeventWorker, self).init_process()
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
def init_process(self):
|
||||||
|
# monkey patch here
|
||||||
|
self.patch()
|
||||||
|
|
||||||
|
# reinit the hub
|
||||||
|
from gevent.hub import reinit
|
||||||
|
hub.reinit()
|
||||||
|
|
||||||
|
# then initialize the process
|
||||||
|
super(GeventWorker, self).init_process()
|
||||||
|
|
||||||
|
|
||||||
class GeventResponse(object):
|
class GeventResponse(object):
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user