fix bug spotted by @daks with mercurial. Also fix concurrency on async.

This commit is contained in:
benoitc 2010-04-15 02:05:39 +02:00
parent 3a2e3edb3e
commit cd5894f59c
3 changed files with 22 additions and 17 deletions

View File

@ -102,7 +102,7 @@ class KeepaliveWorker(Worker):
def run(self): def run(self):
self.init_process() self.init_process()
self.socket.setblocking(0) self.socket.setblocking(1)
while self.alive: while self.alive:
self.notify() self.notify()

View File

@ -3,6 +3,8 @@
# 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.
from __future__ import with_statement
import errno import errno
import collections import collections
@ -11,6 +13,7 @@ from eventlet.green import os
from eventlet.green import socket from eventlet.green import socket
from eventlet import greenio from eventlet import greenio
from eventlet.hubs import trampoline from eventlet.hubs import trampoline
from eventlet.timeout import Timeout
from gunicorn import util from gunicorn import util
from gunicorn import arbiter from gunicorn import arbiter
@ -24,13 +27,14 @@ class EventletWorker(KeepaliveWorker):
self.pool = eventlet.GreenPool(self.worker_connections) self.pool = eventlet.GreenPool(self.worker_connections)
def accept(self): def accept(self):
try: with Timeout(0.1, False):
client, addr = self.socket.accept() try:
self.pool.spawn_n(self.handle, client, addr) client, addr = self.socket.accept()
except socket.error, e: self.pool.spawn_n(self.handle, client, addr)
if e[0] in (errno.EWOULDBLOCK, errno.EAGAIN, errno.ECONNABORTED): except socket.error, e:
return if e[0] in (errno.EWOULDBLOCK, errno.EAGAIN, errno.ECONNABORTED):
raise return
raise
class EventletArbiter(arbiter.Arbiter): class EventletArbiter(arbiter.Arbiter):

View File

@ -3,16 +3,16 @@
# 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.
from __future__ import with_statement
import errno import errno
import os import os
import gevent import gevent
from gevent import socket from gevent import Timeout, socket
from gevent.greenlet import Greenlet from gevent.greenlet import Greenlet
from gevent.pool import Pool from gevent.pool import Pool
from gunicorn import arbiter from gunicorn import arbiter
from gunicorn import util from gunicorn import util
from gunicorn.async.base import KeepaliveWorker from gunicorn.async.base import KeepaliveWorker
@ -24,13 +24,14 @@ class GEventWorker(KeepaliveWorker):
self.pool = Pool(self.worker_connections) self.pool = Pool(self.worker_connections)
def accept(self): def accept(self):
try: with Timeout(0.1, False):
client, addr = self.socket.accept() try:
self.pool.spawn(self.handle, client, addr) client, addr = self.socket.accept()
except socket.error, e: self.pool.spawn(self.handle, client, addr)
if e[0] in (errno.EAGAIN, errno.EWOULDBLOCK, errno.ECONNABORTED): except socket.error, e:
return if e[0] in (errno.EAGAIN, errno.EWOULDBLOCK, errno.ECONNABORTED):
raise return
raise
class GEventArbiter(arbiter.Arbiter): class GEventArbiter(arbiter.Arbiter):