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(('', 1234), handle) # creates a new server
server.start() # start accepting new connections

At this point, any new connection accepted on 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(('', 1234), handle, spawn=pool)


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.

Next page: Name Resolution (DNS)