fix worker timeout.

This commit is contained in:
benoitc 2010-08-12 13:10:56 +02:00
parent 5df427b5cb
commit b281ec002b

View File

@ -7,20 +7,15 @@ from __future__ import with_statement
import errno import errno
import socket import socket
import sys
import eventlet import eventlet
from eventlet.green import os from eventlet.green import os
from eventlet import greenlet
from eventlet import greenpool
from eventlet import greenthread
from eventlet import hubs from eventlet import hubs
from eventlet.greenio import GreenSocket from eventlet.greenio import GreenSocket
from gunicorn.workers.async import AsyncWorker from gunicorn.workers.async import AsyncWorker
from gunicorn import util
class EventletWorker(AsyncWorker): class EventletWorker(AsyncWorker):
@ -39,36 +34,47 @@ class EventletWorker(AsyncWorker):
def timeout_ctx(self): def timeout_ctx(self):
return eventlet.Timeout(self.cfg.keepalive, False) return eventlet.Timeout(self.cfg.keepalive, False)
def acceptor(self, pool):
try:
while self.alive:
try:
client, addr = self.socket.accept()
pool.spawn_n(self.handle, client, addr)
except socket.error, e:
if e[0] not in (errno.EAGAIN, errno.ECONNABORTED):
raise
if pool.running() > self.worker_connections:
continue
try:
hubs.trampoline(self.socket.fileno(), read=True,
timeout=self.timeout)
except eventlet.Timeout:
pass
except eventlet.StopServer:
pool.waitall()
def run(self): def run(self):
self.socket = GreenSocket(family_or_realsock=self.socket.sock) self.socket = GreenSocket(family_or_realsock=self.socket.sock)
self.socket.setblocking(1) self.socket.setblocking(1)
pool = eventlet.GreenPool(self.worker_connections) pool = eventlet.GreenPool(self.worker_connections)
while self.alive:
self.notify() acceptor = eventlet.spawn(self.acceptor, pool)
try: try:
client, addr = self.socket.accept() while self.alive:
client.setblocking(1) self.notify()
util.close_on_exec(client)
pool.spawn_n(self.handle, client, addr)
except socket.error, e:
if e[0] not in (errno.EAGAIN, errno.ECONNABORTED):
raise
if pool.running() > self.worker_connections: if self.ppid != os.getppid():
continue self.log.info("Parent changed, shutting down: %s" % self)
server.stop()
break
eventlet.sleep(0.1)
except KeyboardInterrupt:
pass
if self.ppid != os.getppid(): with eventlet.Timeout(self.timeout, False):
self.log.info("Parent changed, shutting down: %s" % self) eventlet.kill(acceptor, eventlet.StopServe)
break
self.notify()
try:
hubs.trampoline(self.socket.fileno(), read=True,
timeout=self.timeout)
except eventlet.Timeout:
pass