From 1cfaf3a0a1350b674c91795900dbd0efc6349ebb Mon Sep 17 00:00:00 2001 From: donovan Date: Wed, 11 Jun 2008 13:06:56 -0700 Subject: [PATCH] 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 --- eventlet/tpool.py | 4 +++- eventlet/wsgi.py | 26 +++++++++++++++++--------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/eventlet/tpool.py b/eventlet/tpool.py index 6717148..574ee5c 100644 --- a/eventlet/tpool.py +++ b/eventlet/tpool.py @@ -35,7 +35,7 @@ if not isinstance(_rfile, greenio.GreenPipe): def _signal_t2e(): from eventlet import util - nwritten = util.__original_write__(_wpipe,' ') + nwritten = util.__original_write__(_wpipe, ' ') _reqq = Queue(maxsize=-1) _rspq = Queue(maxsize=-1) @@ -104,6 +104,8 @@ class Proxy(object): code only. """ def __init__(self, obj,autowrap=()): self._obj = obj + if isinstance(autowrap, (list, tuple)): + autowrap = dict([(x, True) for x in autowrap]) self._autowrap = autowrap def __getattr__(self,attr_name): diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index ae47767..3b0110a 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -105,13 +105,17 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler): self.environ = self.get_environ() self.application = self.server.app try: - self.handle_one_response() - except socket.error, e: - # Broken pipe, connection reset by peer - if e[0] in (32, 54): - pass - else: - raise + self.server.outstanding_requests += 1 + try: + self.handle_one_response() + except socket.error, e: + # Broken pipe, connection reset by peer + if e[0] in (32, 54): + pass + else: + raise + finally: + self.server.outstanding_requests -= 1 def handle_one_response(self): start = time.time() @@ -289,6 +293,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler): class Server(BaseHTTPServer.HTTPServer): def __init__(self, socket, address, app, log=None, environ=None, max_http_version=None, protocol=HttpProtocol): + self.outstanding_requests = 0 self.socket = socket self.address = address if log: @@ -323,8 +328,10 @@ class Server(BaseHTTPServer.HTTPServer): 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) + if server_event is not None: + server_event.send(serv) if max_size is None: max_size = DEFAULT_MAX_SIMULTANEOUS_REQUESTS 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()) while True: try: - pool.execute_async(lambda: serv.process_request(sock.accept())) + client_socket = sock.accept() + pool.execute_async(serv.process_request, client_socket) except KeyboardInterrupt: api.get_hub().remove_descriptor(sock.fileno()) print "wsgi exiting"