Features

The top-layer provides a simple base class for your own agents. All agents
live in a container.

Containers take care of creating agent instances and performing the
communication between them.

The container provides a clock for the agents. This clock can either be
synchronized with the real (wall-clock) time or be set by an external process
(e.g., other simulators).

RPC:

The rpc layer implements remote procedure calls which let you call methods
on remote objects nearly as if they were normal objects:

Instead of ret = obj.meth(arg) you write ret = await obj.meth(arg).

Request-reply channel:

The channel layer is the basis for the rpc layer. It sends JSON or
MsgPack encoded byte strings over TCP or unix domain sockets. It also maps
replies (of success or failure) to their corresponding request.

Other features:

TLS support for authorization and encrypted communication.

Interchangeable and extensible codecs: JSON and MsgPack (the latter
optionally compressed with Blosc) are built-in. You can add custom codecs or
write (de)serializers for your own objects to extend a codec.

Deterministic, emulated sockets: A LocalQueue transport lets you send and
receive message in a deterministic and reproducible order within a single
process. This helps testing and debugging distributed algorithms.