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 socket
import sys
import eventlet
from eventlet.green import os
from eventlet import greenlet
from eventlet import greenpool
from eventlet import greenthread
from eventlet import hubs
from eventlet.greenio import GreenSocket
from gunicorn.workers.async import AsyncWorker
from gunicorn import util
class EventletWorker(AsyncWorker):
@ -39,36 +34,47 @@ class EventletWorker(AsyncWorker):
def timeout_ctx(self):
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):
self.socket = GreenSocket(family_or_realsock=self.socket.sock)
self.socket.setblocking(1)
pool = eventlet.GreenPool(self.worker_connections)
while self.alive:
self.notify()
acceptor = eventlet.spawn(self.acceptor, pool)
try:
client, addr = self.socket.accept()
client.setblocking(1)
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:
continue
if self.ppid != os.getppid():
self.log.info("Parent changed, shutting down: %s" % self)
break
self.notify()
try:
while self.alive:
self.notify()
try:
hubs.trampoline(self.socket.fileno(), read=True,
timeout=self.timeout)
except eventlet.Timeout:
pass
if self.ppid != os.getppid():
self.log.info("Parent changed, shutting down: %s" % self)
server.stop()
break
eventlet.sleep(0.1)
except KeyboardInterrupt:
pass
with eventlet.Timeout(self.timeout, False):
eventlet.kill(acceptor, eventlet.StopServe)