monleypatch sendfile for the eventlet worker

makesure sendfile isn't blocking on eventlet
This commit is contained in:
benoitc 2013-08-27 18:32:33 +02:00
parent 25094605cf
commit 1eceed0ad5

View File

@ -12,9 +12,26 @@ except ImportError:
raise RuntimeError("You need eventlet installed to use this worker.") raise RuntimeError("You need eventlet installed to use this worker.")
from eventlet import hubs from eventlet import hubs
from eventlet.greenio import GreenSocket from eventlet.greenio import GreenSocket
from eventlet.hubs import trampoline
from gunicorn.http.wsgi import sendfile as o_sendfile
from gunicorn.workers.async import AsyncWorker from gunicorn.workers.async import AsyncWorker
def _eventlet_sendfile(fdout, fdin, offset, nbytes):
while True:
try:
return o_sendfile(fdout, fdin, offset, nbytes)
except OSError as e:
if e.args[0] == errno.EAGAIN:
trampoline(fdout, write=True)
else:
raise
def patch_sendfile():
from gunicorn.http import wsgi
if o_sendfile is not None:
setattr(wsgi, "sendfile", _eventlet_sendfile)
class EventletWorker(AsyncWorker): class EventletWorker(AsyncWorker):
@ -24,6 +41,7 @@ class EventletWorker(AsyncWorker):
if eventlet.version_info < (0, 9, 7): if eventlet.version_info < (0, 9, 7):
raise RuntimeError("You need eventlet >= 0.9.7") raise RuntimeError("You need eventlet >= 0.9.7")
eventlet.monkey_patch(os=False) eventlet.monkey_patch(os=False)
patch_sendfile()
def init_process(self): def init_process(self):
hubs.use_hub() hubs.use_hub()