def Worker(client_socket, addr): print >>sys.stderr, 'info: connection from %r, handled by %r' % ( addr, greenlet.getcurrent()) f = client_socket.makefile() # Read HTTP request. line1 = None while True: line = f.readline().rstrip('\r\n') if not line: # Empty line, end of HTTP request. break if line1 is None: line1 = line # Parse HTTP request. # Please note that an assertion here doesn't abort the server. items = line1.split(' ') assert 3 == len(items) assert items[2] in ('HTTP/1.0', 'HTTP/1.1') assert items[0] == 'GET' assert items[1].startswith('/') # This is to demonstrate the error reporting and recovery behavior of gevent: # We get an error message like this, and the process execution continues: # # Traceback (most recent call last): # File "/usr/local/lib/python2.6/site-packages/gevent/greenlet.py", line 388, in run # result = self._run(*self.args, **self.kwargs) # File "./s2.py", line 137, in Worker # assert 'bad' not in items[1] # AssertionError # <Greenlet at 0xb71acbecL: Worker(<socket at 0xb747668cL fileno=10 sock=127.0.0.1:80, ('127.0.0.1', 55196))> failed with AssertionError assert 'bad' not in items[1] if 'sysexit' in items[1]: print >>sys.stderr, 'info: exiting with SystemExit' #sys.exit() # Doesn't work, gevent.core.__event_handler catches it. gevent.hub.MAIN.throw(SystemExit) if 'exit' in items[1]: print >>sys.stderr, 'info: exiting with throw' gevent.hub.MAIN.throw() try: num = int(items[1][1:]) except ValueError: num = None if 'slow' in items[1]: gevent.hub.sleep(5) # Write HTTP response. if num is None: f.write('HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n') f.write('<a href="/0">start at 0</a><p>Hello, World!\n') else: next_num = Lprng(num).next() f.write('HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n') f.write('<a href="/%d">continue with %d</a>\n' % (next_num, next_num))
def Worker(client_socket, addr): print >> sys.stderr, 'info: connection from %r, handled by %r' % ( addr, greenlet.getcurrent()) f = client_socket.makefile() # Read HTTP request. line1 = None while True: line = f.readline().rstrip('\r\n') if not line: # Empty line, end of HTTP request. break if line1 is None: line1 = line # Parse HTTP request. # Please note that an assertion here doesn't abort the server. items = line1.split(' ') assert 3 == len(items) assert items[2] in ('HTTP/1.0', 'HTTP/1.1') assert items[0] == 'GET' assert items[1].startswith('/') # This is to demonstrate the error reporting and recovery behavior of gevent: # We get an error message like this, and the process execution continues: # # Traceback (most recent call last): # File "/usr/local/lib/python2.6/site-packages/gevent/greenlet.py", line 388, in run # result = self._run(*self.args, **self.kwargs) # File "./s2.py", line 137, in Worker # assert 'bad' not in items[1] # AssertionError # <Greenlet at 0xb71acbecL: Worker(<socket at 0xb747668cL fileno=10 sock=127.0.0.1:80, ('127.0.0.1', 55196))> failed with AssertionError assert 'bad' not in items[1] if 'sysexit' in items[1]: print >> sys.stderr, 'info: exiting with SystemExit' #sys.exit() # Doesn't work, gevent.core.__event_handler catches it. gevent.hub.MAIN.throw(SystemExit) if 'exit' in items[1]: print >> sys.stderr, 'info: exiting with throw' gevent.hub.MAIN.throw() try: num = int(items[1][1:]) except ValueError: num = None if 'slow' in items[1]: gevent.hub.sleep(5) # Write HTTP response. if num is None: f.write('HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n') f.write('<a href="/0">start at 0</a><p>Hello, World!\n') else: next_num = Lprng(num).next() f.write('HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n') f.write('<a href="/%d">continue with %d</a>\n' % (next_num, next_num))
def GeventListener(server_socket): # Please note that exceptions raised here will be printed and then ignored # by the gevent.hub main loop. print >> sys.stderr, ('info: accepting connections in %r' % greenlet.getcurrent()) while True: client_socket, addr = server_socket.accept() gevent.spawn(Worker, client_socket, addr) # Equally good: #gevent.hub.spawn_raw(Worker, client_socket, addr) client_socket = addr = None # Save memory.
def GeventListener(server_socket): # Please note that exceptions raised here will be printed and then ignored # by the gevent.hub main loop. print >>sys.stderr, ( 'info: accepting connections in %r' % greenlet.getcurrent()) while True: client_socket, addr = server_socket.accept() gevent.spawn(Worker, client_socket, addr) # Equally good: #gevent.hub.spawn_raw(Worker, client_socket, addr) client_socket = addr = None # Save memory.