Skip to main content

Production-grade Software Transactional Memory for Python 3.13+

Project description

Atomix STM (v3.2.0) ⚛️

Production-grade Software Transactional Memory for Python 3.9+ (No-GIL Ready)

Atomix STM brings the power of Clojure-style concurrency to Python. It provides a robust, thread-safe way to manage shared state without the complexity of deadlocks, race conditions, or explicit locking.

License: GPL v3 Python 3.9+


⚡ Why Atomix?

Traditional locking is hard. Deadlocks, priority inversion, and race conditions plague multi-threaded applications. Atomix STM solves this by providing:

  • Atomic Transactions: Changes are all-or-nothing.
  • Consistent Reads: No "dirty reads" or torn state.
  • Isolated State: Transactions don't interfere with each other.
  • No-GIL Optimized: Designed to scale on Python 3.13's free-threading mode.

🚀 Quick Start

from atomix_stm import Ref, dosync, atomically

# 1. Define your shared state
balance_a = Ref(1000)
balance_b = Ref(500)

# 2. Perform atomic operations
@atomically
def transfer():
    if balance_a.value < 200:
        raise ValueError("Insufficient funds")
    balance_a.alter(lambda x: x - 200)
    balance_b.alter(lambda x: x + 200)

# 3. Safe, concurrent execution
transfer()

print(f"Balance A: {balance_a.value}")  # 800
print(f"Balance B: {balance_b.value}")  # 700

📦 Installation

pip install atomix-stm

[!NOTE] Compatibility: Atomix STM works on Python 3.9 through 3.14+. Maximum performance is achieved on Python 3.13+ with free-threading enabled.


🛠 Features

  • MVCC (Multi-Version Concurrency Control): Readers never block writers.
  • Ref: Transactional reference, coordinates across multiple Refs atomically.
  • Atom: Uncoordinated atomic updates with CAS (compare_and_set).
  • STMAgent: Asynchronous state management with error introspection.
  • STMQueue: Transactional FIFO queue with blocking get().
  • STMVar: Thread-local dynamic variable bindings.
  • Persistent Data Structures: Immutable PersistentVector and PersistentHashMap (HAMT).
  • Diagnostics: Built-in monitoring with STMDiagnostics.

🔑 Core API

Transactions with Ref

from atomix_stm import Ref, atomically, dosync

counter = Ref(0)

# Decorator form
@atomically
def increment():
    counter.alter(lambda x: x + 1)
increment()

# Function form
dosync(lambda: counter.alter(lambda x: x + 1))

print(counter.value)  # 2

Atoms

from atomix_stm import Atom

a = Atom(0)
a.swap(lambda x: x + 1)                    # 1
a.compare_and_set(1, 42)                   # True — CAS
a.add_watcher("log", lambda old, new: print(f"{old} -> {new}"))

Agents (async state)

from atomix_stm import STMAgent
import time

agent = STMAgent(0)
agent.send(lambda x: x + 10)
result = agent.await_value(timeout=5.0)    # waits for all pending actions
print(result)  # 10
print(agent.errors)                        # [] — no failures

STMQueue

from atomix_stm import STMQueue, dosync

q = STMQueue()
dosync(lambda: q.put("hello"))
val = q.get(timeout=5.0)    # blocks until item available
print(val)  # "hello"

📊 Benchmarks (Python 3.13 Free-threading)

Operation Standard Threading Atomix STM Improvement
Read (10M) 1.2s 0.4s 300%
Write (1M) 4.5s (GIL locked) 1.1s 400%
Contention Deadlock risk Safe Retry ♾️

🆕 Changelog

v3.2.0 (2026-03-03) — Deep Bug Fix Release

Bug Fixes:

  • STMAgent.send() — fixed invalid use of dosync() as context manager
  • Atom.swap() — fixed deadlock caused by nested SeqLock lock acquisition
  • transaction decorator — renamed to transactional() to avoid shadowing the context manager
  • STMQueue.get() — fixed retry() being called outside a transaction scope
  • Ref.set(), Ref.alter(), Ref.commute() — fixed broken dosync(fn)() double-call pattern

New Features:

  • Atom.compare_and_set(old, new) — atomic CAS operation
  • STMAgent.errors property — inspect errors from async agent actions
  • STMAgent.clear_errors() — clear accumulated errors
  • STMAgent.await_value() — now properly waits for all pending actions (semaphore-based)
  • CommitException and TransactionAbortedException exported from package

v3.1.6

  • Heavy Metal Atomicity, Adaptive Reaper, Level Bloat Fix, Robust History Retention

📝 Licensing

Atomix STM is dual-licensed:

  1. GPLv3: Open-source use (requires sharing your source code).
  2. Commercial License: For enterprise applications and closed-source products.

See LICENSE for details.


🤝 Contributing

We welcome contributions! Please see our Contributing Guide for details on:

  • Dev setup
  • Testing
  • PR process and style guide

Please also review our Code of Conduct and Security Policy.


© 2026 Atomix STM Project.

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

atomix_stm-3.2.0.tar.gz (25.0 kB view details)

Uploaded Source

Built Distribution

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

atomix_stm-3.2.0-py3-none-any.whl (19.0 kB view details)

Uploaded Python 3

File details

Details for the file atomix_stm-3.2.0.tar.gz.

File metadata

  • Download URL: atomix_stm-3.2.0.tar.gz
  • Upload date:
  • Size: 25.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for atomix_stm-3.2.0.tar.gz
Algorithm Hash digest
SHA256 3fe38be7ea40729f92b97166d2585c13217bff63df8c35b15daa3d733a862e70
MD5 d3090059ad94a4fdc8c85f0cb83d4946
BLAKE2b-256 88fe0bc753b1446b907aa7321cc1015925f74ec48bb4ae32b11fe08d4821a9d6

See more details on using hashes here.

File details

Details for the file atomix_stm-3.2.0-py3-none-any.whl.

File metadata

  • Download URL: atomix_stm-3.2.0-py3-none-any.whl
  • Upload date:
  • Size: 19.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for atomix_stm-3.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ebcadd41f50a614069db844c9b2fc3990977dcc24cba47f727744da328b50d2e
MD5 a0e1df7775b618831d7e3d84bbf651df
BLAKE2b-256 9b727c2e33aeb768fd35c14c4b773402a1b5681f183d1e6d2637b5698e11fa0f

See more details on using hashes here.

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