Skip to main content

Native Rust actor runtime with Python bindings — supervised concurrency from one core to a cluster.

Project description

atomr

A native Rust runtime for actor-based concurrent and distributed systems, with first-class Python bindings. atomr gives you a single mental model — addressable units of state plus behavior, communicating by asynchronous messages — that scales from a single core to a cluster, and increasingly from a CPU to a GPU.

use atomr::prelude::*;

#[derive(Default)]
struct Greeter;

#[async_trait::async_trait]
impl Actor for Greeter {
    type Msg = String;
    async fn handle(&mut self, _ctx: &mut Context<Self>, msg: String) {
        println!("hi {msg}");
    }
}

Why an actor runtime, in Rust, now

The actor model is the same idea wherever it runs: a small, addressable unit of state plus behavior, talking to other actors by asynchronous message passing. That model is a good fit for two converging trends.

Agentic systems. Long-lived, autonomous, collaborating processes that reason, call tools, and coordinate are exactly what supervised, addressable actors describe. Each agent is an actor; conversations are mailboxes; tool calls are typed messages; failure is supervised, not silently swallowed. atomr gives that model a runtime that doesn't trade performance for safety.

Unified compute. Modern workloads no longer live entirely on the CPU. Inference, embedding, scoring, simulation — they want a GPU. Coordination, control flow, I/O, persistence — they want a CPU. Today's stacks force you to glue the two with ad-hoc batching layers, queues, and serialization boundaries. The actor model already encodes the right boundary: a message is the dispatch unit. atomr is built so that the same actor_ref.tell(msg) can target a CPU mailbox today and a CUDA-backed dispatcher tomorrow — with the same supervision, the same backpressure, the same observability. The runtime is explicit about where work runs without forcing the developer to write two programs.

Granular efficiency. Rust gives us deterministic resource use, zero-cost abstractions, and ownership-as-concurrency-safety. Per-message cost stays low. Per-actor footprint stays small. The scheduler can hand work to a tokio worker, a dedicated dispatcher, or — by design — a GPU stream, without changing the message contract. That same precision lets the runtime push backpressure, mailboxes, and supervision down to a level where they don't need to be rebuilt at every layer above.

A longer argument is in docs/actors-and-agentic-computing.md.

What's in the box

Crate What it does
atomr Umbrella facade re-exporting the core types
atomr-core Actors, supervision, dispatch, mailboxes, FSMs, event stream, coordinated shutdown
atomr-config HOCON-style layered configuration
atomr-macros Ergonomic derives and helpers
atomr-testkit Probes, virtual time, deterministic test scaffolding
atomr-remote Location-transparent messaging across processes (TCP + framed PDU + reliable delivery)
atomr-cluster Membership, gossip, reachability, split-brain resolution
atomr-cluster-tools Singleton, pub/sub, cluster-client patterns
atomr-cluster-sharding Shard regions, rebalance, remember-entities, persistent coordinator
atomr-cluster-metrics Adaptive load balancing
atomr-distributed-data Convergent replicated data types (CRDTs) over the cluster — OrMap, LWWMap, PNCounterMap, ORMultiMap, replicator subscribe
atomr-distributed-data-lmdb redb-backed DurableStore for distributed-data
atomr-persistence Event sourcing — journals, snapshots, recovery, async snapshotting, persistent FSM, ALOD
atomr-persistence-query Tagged event streams over journals
atomr-persistence-query-inmemory In-memory query journal for tests + samples
atomr-persistence-{sql,redis,mongodb,cassandra,aws,azure} Storage adapters (Postgres / MySQL / Redis / Mongo / Cassandra / DynamoDB / Azurite)
atomr-persistence-tck Conformance suite — journal_replay_edge_cases, snapshot_extended_suite, concurrent + extended journal suites
atomr-streams Typed reactive streams (sources, flows, sinks, junctions, hubs, kill switches, sub-streams, conflate/expand, merge_sorted/merge_prioritized, queue/restart)
atomr-serialization-hyperion Hyperion-compatible serializer surface
atomr-coordination Lease-based leadership primitives
atomr-discovery Pluggable service discovery
atomr-di Dependency-injection container
atomr-hosting Builder API for wiring system + config + DI together
atomr-telemetry Tracing, metrics, exporters
atomr-dashboard Live web UI over the running system

Plus a Python facade — pip install atomr — that exposes the full actor model: real Context (children, watch, stash, become, timers, sender), configurable SupervisorStrategy with retry-budget enforcement, routers and resilience patterns, multi-node TCP + in-process cluster transports with per-system codec registries, event-sourced actors, the full distributed-data CRDT suite + Replicator, real ShardRegion with allocation/passivation/remember- entities, the streams DSL on arbitrary Python objects, and GIL-isolated interpreter pools for CPU-bound work.

Test coverage

atomr ships ~545 lib tests plus ~420 integration tests across the workspace. Subsystem coverage includes:

  • Cluster. Vector clock, member ordering, reachability, cluster events, gossip, SBR strategies, heartbeat, membership state, plus a LeaderHandover watcher and a multinode harness.
  • Cluster tools / sharding. Singleton, ClusterClient, distributed PubSub, shard allocation + handoff, at-least-once-delivery.
  • Distributed data. OrMap / LWWMap / PNCounterMap / ORMultiMap, CRDT laws, replicator subscribe, three-node convergence suites, redb-backed durable store (atomr-distributed-data-lmdb).
  • Persistence. PersistentFSM, EventSourced, ALOD, snapshot retention, plus the TCK's journal_replay_edge_cases and snapshot_extended_suite exercised against every backend (Postgres, MySQL, Redis, MongoDB, Cassandra, DynamoDB, Azurite, redb) in CI.
  • Streams. FlowOperator, Hub, SubStream, Recovery, conflate / expand, merge_sorted / merge_prioritized, Queue / Restart.
  • Core runtime. Scheduler, Stash, Extensions, Lifecycle, IO managers (TcpManager outbound Connect + IO coverage), ActorPath / Address, FailureDetector, EndpointState, Routing.
  • Hosting / DI / lease. ServiceContainer, Hosting builder, Lease.
  • Out-of-process multinode. MultiNodeOopController and MultiNodeOopNode drive cross-process scenarios from the testkit.

Quick start (Rust)

The umbrella crate is published on crates.io as atomr:

[dependencies]
atomr = { version = "0.1", features = ["cluster", "persistence"] }

Or pull in subsystem crates directly — atomr-core, atomr-cluster, atomr-persistence, atomr-streams, etc. are all on crates.io.

use atomr::prelude::*;

#[derive(Default)]
struct Greeter;

#[async_trait::async_trait]
impl Actor for Greeter {
    type Msg = String;
    async fn handle(&mut self, _ctx: &mut Context<Self>, msg: String) {
        println!("hi {msg}");
    }
}

# async fn run() -> Result<(), Box<dyn std::error::Error>> {
let system = ActorSystem::create("S", Config::empty()).await?;
let greeter = system.actor_of(Props::create(Greeter::default), "greeter")?;
greeter.tell("world".to_string());
system.terminate().await;
# Ok(()) }

Quick start (Python)

python -m venv .venv && source .venv/bin/activate
pip install atomr
from atomr import Actor, ActorSystem, props

class Greeter(Actor):
    async def handle(self, ctx, msg):
        return f"hello, {msg}"

system = ActorSystem.create_blocking("app")
ref = system.actor_of(props(Greeter), "greeter")
print(ref.ask_blocking("world", timeout=5.0))   # -> "hello, world"
system.terminate_blocking()

handle(ctx, msg) receives a real Contextctx.spawn(props, name), ctx.watch(ref), ctx.stash(msg), ctx.become(handler), ctx.schedule_once(0.5, "tick") (returns a Cancelable), ctx.sender, etc. Two systems can join a cluster over TCP or an in-process registry, exchange messages via per-system codec registries, and run sharded entity actors:

from atomr.cluster import Cluster, ClusterRegistry

ca = Cluster.with_tcp_transport(sys_a, "127.0.0.1:0")
cb = Cluster.with_tcp_transport(sys_b, "127.0.0.1:0")
sys_a.register_codec("json", encode, decode, manifests=["app.MyMsg"])
sys_a.tell_remote(remote_ref, MyMsg(...))

See docs/python.md for the full guide: distributed actors, supervision, patterns + routers, sharding, event sourcing, distributed data, streams DSL, GIL strategies (python-pinned, python-subinterpreter-pool per PEP 684, python-nogil per PEP 703, python-subprocess), and the C-extension compatibility registry. The Python suite ships with 270 tests including TCP and in-process multi-node cluster, sharding, and replicator integration tests.

Building from source

# Rust
cargo build --workspace
cargo test --workspace

# Python bindings (requires maturin + a Python dev toolchain)
maturin develop --release
pytest python/tests -v

# Docs (optional)
pip install mkdocs-material
mkdocs serve

Profiling

atomr ships with a cross-runtime profiler that measures the same four scenarios (tell, ask, fanout, cpu) in Rust and Python and emits a shared JSON schema so the two paths can be compared directly.

cargo run --release -p atomr-profiler -- --scenario all --format md
python -m atomr.profiler --scenario all --format md

See docs/profiler.md.

Layout

crates/                 Rust workspace
crates/py-bindings/     PyO3 bridge crates
python/atomr/           Python package
python/tests/           Python integration tests
examples/               Runnable Rust examples
benches/                Criterion benches
scripts/                Cross-runtime tooling
docs/                   mkdocs-material source
xtask/                  Cargo xtask (audit, profile, bump, verify)

Learn more

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

atomr-0.10.0.tar.gz (695.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

atomr-0.10.0-cp310-abi3-win_amd64.whl (5.3 MB view details)

Uploaded CPython 3.10+Windows x86-64

atomr-0.10.0-cp310-abi3-musllinux_1_2_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ x86-64

atomr-0.10.0-cp310-abi3-musllinux_1_2_aarch64.whl (4.8 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

atomr-0.10.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.8 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

atomr-0.10.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

atomr-0.10.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (8.9 MB view details)

Uploaded CPython 3.10+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file atomr-0.10.0.tar.gz.

File metadata

  • Download URL: atomr-0.10.0.tar.gz
  • Upload date:
  • Size: 695.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for atomr-0.10.0.tar.gz
Algorithm Hash digest
SHA256 ce09f7b9175b82e9fb6a824efd31525b9ddc4619a27d9c5a9e766df11edeb631
MD5 b29795ba96e926c910c377ca0d29baba
BLAKE2b-256 59c8d193ee9c6813f43d80cb1671b3b58156bf13cee6cfee807d8854d14be5dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for atomr-0.10.0.tar.gz:

Publisher: release.yml on rustakka/atomr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file atomr-0.10.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: atomr-0.10.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 5.3 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for atomr-0.10.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d658c10d2fd71f24d08cd08fc48c48bca18da7366e165ff8b1a63108ef0ef440
MD5 5c4410b1210de8c2fd5a985daa901639
BLAKE2b-256 89da2dd1fd686d38ab0dd92fa1a57d4e55cc8acf58253f1661a78a3c703cfa16

See more details on using hashes here.

Provenance

The following attestation bundles were made for atomr-0.10.0-cp310-abi3-win_amd64.whl:

Publisher: release.yml on rustakka/atomr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file atomr-0.10.0-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for atomr-0.10.0-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 23f940a0a92cbfb9ef6a3eca440f9cbc631a3dcc898819182591ad9133e87f2d
MD5 1946bbbe3c4f449bbda8cd9b9e9883b3
BLAKE2b-256 f5adcbc62e32d54918e2585146bcf096712d64666bc9d853c6910b677f4eb8bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for atomr-0.10.0-cp310-abi3-musllinux_1_2_x86_64.whl:

Publisher: release.yml on rustakka/atomr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file atomr-0.10.0-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for atomr-0.10.0-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b5c724e793df6fbb58ea5a0fe23a4e9ec1026ae81a9fc99f4238426f497f4c12
MD5 782f2a609e6dc334b6e0a11dc98fa396
BLAKE2b-256 78ec21f05b8efac33e1306907f9582561fc91fdb4c29dfb30ce02ff87ec61b08

See more details on using hashes here.

Provenance

The following attestation bundles were made for atomr-0.10.0-cp310-abi3-musllinux_1_2_aarch64.whl:

Publisher: release.yml on rustakka/atomr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file atomr-0.10.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for atomr-0.10.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6f8dd3871b6beb192556ee024c17d3b0c0a180322f11057f87b5e4912f2477c0
MD5 ed56113d803b0a9de96b9fe8d23c7c37
BLAKE2b-256 0aefd58e773e34397ec2a1b81bafa5763e2b678583adbfcac0ad8769a58111d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for atomr-0.10.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on rustakka/atomr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file atomr-0.10.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for atomr-0.10.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 97f0a784f723ab45332e41aa166b60ccd9b97e048f56f616418a1b5d4b3cdbb5
MD5 ce10a02bf011661fd2afb41727ac2209
BLAKE2b-256 26e0c7ea2387c99cd6f17ea619690335d3db40e20a55e5bb1b23dce645608381

See more details on using hashes here.

Provenance

The following attestation bundles were made for atomr-0.10.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on rustakka/atomr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file atomr-0.10.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for atomr-0.10.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 54e8df2a52a26eb33e99cb36822575558a2cc262e12cf66ea949c5ecbf1833a3
MD5 5a632b743439828b75d6736a441abb7d
BLAKE2b-256 8687372a61b0ecdce9b3bd14dddeb11a3c0e9510e991e1e3347a1e2667693410

See more details on using hashes here.

Provenance

The following attestation bundles were made for atomr-0.10.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on rustakka/atomr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page