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.

Important

The provided server implementations are intended primarily for development and testing, or internal usage, and otherwise only generally “safe” scenarios. They have not been security audited. Expose them to the public Internet at your own risk.

API Reference#

Examples#

More examples are available: