Use the correct write function in tpool; use a dict instead of a list for speed of testing membership; fix a bug in where accept is called in wsgi; keep track of outstanding requests in wsgi; add server_event to wsgi.server so other coroutines can get the Server instance
This commit is contained in:
@@ -35,7 +35,7 @@ if not isinstance(_rfile, greenio.GreenPipe):
|
|||||||
|
|
||||||
def _signal_t2e():
|
def _signal_t2e():
|
||||||
from eventlet import util
|
from eventlet import util
|
||||||
nwritten = util.__original_write__(_wpipe,' ')
|
nwritten = util.__original_write__(_wpipe, ' ')
|
||||||
|
|
||||||
_reqq = Queue(maxsize=-1)
|
_reqq = Queue(maxsize=-1)
|
||||||
_rspq = Queue(maxsize=-1)
|
_rspq = Queue(maxsize=-1)
|
||||||
@@ -104,6 +104,8 @@ class Proxy(object):
|
|||||||
code only. """
|
code only. """
|
||||||
def __init__(self, obj,autowrap=()):
|
def __init__(self, obj,autowrap=()):
|
||||||
self._obj = obj
|
self._obj = obj
|
||||||
|
if isinstance(autowrap, (list, tuple)):
|
||||||
|
autowrap = dict([(x, True) for x in autowrap])
|
||||||
self._autowrap = autowrap
|
self._autowrap = autowrap
|
||||||
|
|
||||||
def __getattr__(self,attr_name):
|
def __getattr__(self,attr_name):
|
||||||
|
@@ -105,13 +105,17 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
self.environ = self.get_environ()
|
self.environ = self.get_environ()
|
||||||
self.application = self.server.app
|
self.application = self.server.app
|
||||||
try:
|
try:
|
||||||
self.handle_one_response()
|
self.server.outstanding_requests += 1
|
||||||
except socket.error, e:
|
try:
|
||||||
# Broken pipe, connection reset by peer
|
self.handle_one_response()
|
||||||
if e[0] in (32, 54):
|
except socket.error, e:
|
||||||
pass
|
# Broken pipe, connection reset by peer
|
||||||
else:
|
if e[0] in (32, 54):
|
||||||
raise
|
pass
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
finally:
|
||||||
|
self.server.outstanding_requests -= 1
|
||||||
|
|
||||||
def handle_one_response(self):
|
def handle_one_response(self):
|
||||||
start = time.time()
|
start = time.time()
|
||||||
@@ -289,6 +293,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
|
|
||||||
class Server(BaseHTTPServer.HTTPServer):
|
class Server(BaseHTTPServer.HTTPServer):
|
||||||
def __init__(self, socket, address, app, log=None, environ=None, max_http_version=None, protocol=HttpProtocol):
|
def __init__(self, socket, address, app, log=None, environ=None, max_http_version=None, protocol=HttpProtocol):
|
||||||
|
self.outstanding_requests = 0
|
||||||
self.socket = socket
|
self.socket = socket
|
||||||
self.address = address
|
self.address = address
|
||||||
if log:
|
if log:
|
||||||
@@ -323,8 +328,10 @@ class Server(BaseHTTPServer.HTTPServer):
|
|||||||
self.log.write(message + '\n')
|
self.log.write(message + '\n')
|
||||||
|
|
||||||
|
|
||||||
def server(sock, site, log=None, environ=None, max_size=None, max_http_version=DEFAULT_MAX_HTTP_VERSION, protocol=HttpProtocol):
|
def server(sock, site, log=None, environ=None, max_size=None, max_http_version=DEFAULT_MAX_HTTP_VERSION, protocol=HttpProtocol, server_event=None):
|
||||||
serv = Server(sock, sock.getsockname(), site, log, environ=None, max_http_version=max_http_version, protocol=protocol)
|
serv = Server(sock, sock.getsockname(), site, log, environ=None, max_http_version=max_http_version, protocol=protocol)
|
||||||
|
if server_event is not None:
|
||||||
|
server_event.send(serv)
|
||||||
if max_size is None:
|
if max_size is None:
|
||||||
max_size = DEFAULT_MAX_SIMULTANEOUS_REQUESTS
|
max_size = DEFAULT_MAX_SIMULTANEOUS_REQUESTS
|
||||||
pool = coros.CoroutinePool(max_size=max_size)
|
pool = coros.CoroutinePool(max_size=max_size)
|
||||||
@@ -332,7 +339,8 @@ def server(sock, site, log=None, environ=None, max_size=None, max_http_version=D
|
|||||||
print "(%s) wsgi starting up on %s" % (os.getpid(), sock.getsockname())
|
print "(%s) wsgi starting up on %s" % (os.getpid(), sock.getsockname())
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
pool.execute_async(lambda: serv.process_request(sock.accept()))
|
client_socket = sock.accept()
|
||||||
|
pool.execute_async(serv.process_request, client_socket)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
api.get_hub().remove_descriptor(sock.fileno())
|
api.get_hub().remove_descriptor(sock.fileno())
|
||||||
print "wsgi exiting"
|
print "wsgi exiting"
|
||||||
|
Reference in New Issue
Block a user