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):
self.init_process()
self.socket.setblocking(0)
self.socket.setblocking(1)
while self.alive:
self.notify()

View File

@ -3,6 +3,8 @@
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from __future__ import with_statement
import errno
import collections
@ -11,6 +13,7 @@ from eventlet.green import os
from eventlet.green import socket
from eventlet import greenio
from eventlet.hubs import trampoline
from eventlet.timeout import Timeout
from gunicorn import util
from gunicorn import arbiter
@ -24,13 +27,14 @@ class EventletWorker(KeepaliveWorker):
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
with Timeout(0.1, False):
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):

View File

@ -3,16 +3,16 @@
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from __future__ import with_statement
import errno
import os
import gevent
from gevent import socket
from gevent import Timeout, socket
from gevent.greenlet import Greenlet
from gevent.pool import Pool
from gunicorn import arbiter
from gunicorn import util
from gunicorn.async.base import KeepaliveWorker
@ -24,13 +24,14 @@ class GEventWorker(KeepaliveWorker):
self.pool = Pool(self.worker_connections)
def accept(self):
try:
client, addr = self.socket.accept()
self.pool.spawn(self.handle, client, addr)
except socket.error, e:
if e[0] in (errno.EAGAIN, errno.EWOULDBLOCK, errno.ECONNABORTED):
return
raise
with Timeout(0.1, False):
try:
client, addr = self.socket.accept()
self.pool.spawn(self.handle, client, addr)
except socket.error, e:
if e[0] in (errno.EAGAIN, errno.EWOULDBLOCK, errno.ECONNABORTED):
return
raise
class GEventArbiter(arbiter.Arbiter):