# Executors

Executors control how a received message is scheduled for processing by a Server. This scheduling can be synchronous or asynchronous.

A synchronous executor will process the message on the Server’s thread. This means the Server can process only one message at a time. Other incoming messages will not be processed until the current message is done processing. For example, in the case of an RPCServer only one method call will be invoked at a time. A synchronous executor guarantees that messages complete processing in the order that they are received.

An asynchronous executor will process received messages concurrently. The Server thread will not be blocked by message processing and can continue to service incoming messages. There are no ordering guarantees - message processing may complete in a different order than they were received. The executor may be configured to limit the maximum number of messages that are processed at once.

## Available Executors

### eventlet

Executor that uses a green thread pool to execute calls asynchronously.

See: https://docs.python.org/dev/library/concurrent.futures.html and http://eventlet.net/doc/modules/greenpool.html for information on how this works.

It gathers statistics about the submissions executed for post-analysis…

### threading

Executor that uses a thread pool to execute calls asynchronously.

It gathers statistics about the submissions executed for post-analysis…

Note that this executor never shrinks its thread pool, which will cause the pool to eventually reach its maximum capacity defined by max_workers. Check `DynamicThreadPoolExecutor` for an alternative.

See: https://docs.python.org/dev/library/concurrent.futures.html

this page last updated: 2026-03-23 08:51:56

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.

found an error? report a bug