gunicorn/gunicorn/async/eventlet_server.py
2010-04-12 00:53:03 +02:00

47 lines
1.3 KiB
Python

# -*- coding: utf-8 -
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import errno
import collections
import eventlet
from eventlet.green import os
from eventlet.green import socket
from eventlet import greenio
from eventlet.hubs import trampoline
from gunicorn import util
from gunicorn import arbiter
from gunicorn.async.base import KeepaliveWorker
class EventletWorker(KeepaliveWorker):
def init_process(self):
super(EventletWorker, self).init_process()
self.pool = eventlet.GreenPool(self.worker_connections)
def accept(self):
try:
client, addr = self.socket.accept()
self.pool.spawn_n(self.handle, client, addr)
except socket.error, e:
if e[0] in (errno.EWOULDBLOCK, errno.EAGAIN, errno.ECONNABORTED):
return
raise
class EventletArbiter(arbiter.Arbiter):
@classmethod
def setup(cls):
import eventlet
if eventlet.version_info < (0,9,7):
raise RuntimeError("You need eventlet >= 0.9.7")
eventlet.monkey_patch(all=False, socket=True, select=True, thread=True)
def init_worker(self, worker_age, pid, listener, app, timeout, conf):
return EventletWorker(worker_age, pid, listener, app, timeout, conf)