There are a few classes to simplify server implementation with gevent. They all share a similar interface, inherited from BaseServer:
def handle(socket, address):
print('new connection!')
server = StreamServer(('127.0.0.1', 1234), handle) # creates a new server
server.start() # start accepting new connections
At this point, any new connection accepted on 127.0.0.1:1234 will result in a new gevent.Greenlet spawned running the handle function. To stop a server use BaseServer.stop() method.
In case of a gevent.pywsgi.WSGIServer, handle must be a WSGI application callable.
It is possible to limit the maximum number of concurrent connections, by passing a gevent.pool.Pool instance. In addition, passing a pool allows the BaseServer.stop() method to kill requests that are in progress:
pool = Pool(10000) # do not accept more than 10000 connections
server = StreamServer(('127.0.0.1', 1234), handle, spawn=pool)
server.serve_forever()
Tip
If you don’t want to limit concurrency, but you do want to be able to kill outstanding requests, use a pool created with a size of None.
The BaseServer.serve_forever() method calls BaseServer.start() and then waits until interrupted or until the server is stopped.
The gevent.pywsgi module contains an implementation of a PEP 3333 WSGI server. In addition, gunicorn is a stand-alone server that supports gevent. Gunicorn has its own HTTP parser but can also use gevent.wsgi module.
More examples are available in the code repository:
Next page: gevent.wsgi – Backwards compatibility alias for gevent.pywsgi