Implementing servers

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.baseserver – Base class for implementing servers