Example #1
0
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))
Example #2
0
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))
Example #3
0
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.
Example #4
0
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.