Skip to main content

A lock-free, high-concurrency task broker for Python, powered by Rust.

Project description


Logo

Pyroxide

A lock-free, high-concurrency background task broker for Python, powered by Rust.

Rust Python License: MIT/Apache-2.0/Coffee

Explore the docs »

View Demo · Report Bug · Request Feature


Pyroxide is a high-concurrency, lock-free background task broker designed to bridge Python and Rust. It allows CPU-bound or blocking workloads to bypass the Python Global Interpreter Lock (GIL) with minimal memory overhead and zero CPU-sleep polling.

With Pyroxide, you can seamlessly offload tasks from Python to a background native OS thread pool. Tasks block natively on the OS kernel level using signaling primitives (Condvar) rather than CPU-burning sleep loops, allowing Python to yield control instantly.

Key Features

  • Bypass the Python GIL: Explicitly release the Python GIL via PyO3 thread-detaching, running heavy computations concurrently on native OS threads.
  • Zero-Overhead Status Tracking: Avoids global lock contention using an atomic-state (AtomicU8) task tracking structure per task slot under a concurrent sharded/read-lock Slab architecture.
  • Instant Condvar Signaling: Replaces latency-inducing polling loops (time.sleep) with native Rust Condvar waking, waking waiting Python threads in microseconds with 0% CPU consumption.
  • Dynamic Task Execution: Seamlessly offloads dynamic Python callbacks (running inside temporary attached-GIL scopes) or executes native Rust functions completely GIL-free.
  • Configurable Concurrency: Set worker thread pool size dynamically at startup via environment variables.
  • Panic Safety: Wrapped task execution prevents Rust worker panics from crashing the host Python interpreter, gracefully marking tasks as Failed instead.
  • Zero-Copy Byte Buffers: Easily pass byte arrays, memoryviews, and columnar buffers (e.g., Apache Arrow) across the C-ABI without copy overhead.
  • Full Type-Hinting: Exposes advanced typing generic @overload signatures, offering full autocomplete support for modern IDEs.

Installation

From PyPI (Recommended)

pip install pyro3

Build and Install locally

Ensure you have Rust, Python (3.8+), and maturin installed.

Build and Install locally

Compile and install the C-extension into your active virtual environment:

# Clone the repository
git clone https://github.com/emivvvvv/pyroxide.git
cd pyroxide

# Compile and install editable build using maturin
pip install maturin
maturin develop

Performance & Validation

We benchmarked Pyroxide against the baseline polling-based task brokers (using a 1ms simulated execution payload to isolate broker overhead):

1. Latency (Single-Threaded Sequential Wait)

Tasks Baseline (10ms Polling Loop) Pyroxide (Condvar + Lock-Free) Latency Reduction
10 Tasks 1.0180s 0.0002s (0.2ms) ~5,000x faster
50 Tasks 3.5289s 0.0008s (0.8ms) ~4,400x faster
Avg. Latency 70.58ms 0.02ms (20µs) 3,500x less overhead

2. Multi-Threaded Throughput (40 Concurrent Submissions)

Threads Baseline (Lock Contention) Pyroxide (Lock-Free) Speedup
2 Threads 10.1848s 0.0032s (3.2ms) 3,180x faster
4 Threads 5.1193s 0.0013s (1.3ms) 3,930x faster
8 Threads 2.5624s 0.0015s (1.5ms) 1,700x faster

Configuration

Pyroxide can be configured via environment variables before the engine initializes:

  • PYROXIDE_WORKERS: Sets the number of background worker threads in the pool. Defaults to the number of CPU cores (available_parallelism).
export PYROXIDE_WORKERS=4
python my_app.py

Quick Start

1. Offloading Python Callables (Default)

By default, @task runs the decorated Python function in the background pool.

from pyroxide import task

@task
def calculate_square(x: int) -> int:
    # Runs on background OS threads in the Rust pool
    return x * x

# Submit and get a handle immediately
handle = calculate_square(12)
print(f"Task status: {handle.status}")

# Blocks natively (0% CPU) until complete, then returns result
# Automatically evicts the task from the Rust Slab once retrieved (consume=True)
result = handle.result()
print(f"Result: {result}") # Output: 144

2. Offloading Native Rust Tasks (GIL-Free)

To completely bypass the Python GIL and run logic natively in Rust:

from pyroxide import task

# Passes the string to Rust which processes it completely GIL-free
@task(native=True)
def native_uppercase(payload: str) -> None:
    pass

handle = native_uppercase("hello pyroxide")
result = handle.result()
print(f"Result: {result}") # Output: b"HELLO PYROXIDE"

3. Graceful Memory Reclamation & Retaining Results

By default, result() consumes and evicts the task. If you want to keep the task in the Slab (e.g. to check status or result again later), set consume=False. It will be automatically cleaned up later via the Python garbage collector when the handle reference is deleted:

import gc
from pyroxide import task
from pyroxide._pyroxide import get_slab_size

handle = calculate_square(10)
print(get_slab_size()) # Output: 1

# Retrieve result but retain task in the Slab
result = handle.result(consume=False)

# Deleting the Python TaskHandle reference forces GC eviction in the Rust Slab
del handle
gc.collect()

print(get_slab_size()) # Output: 0 (No memory leaked)

Contributing

Contributions are welcome! If you'd like to improve Pyroxide or add support for additional features, feel free to open an issue or submit a pull request on GitHub.

License

Pyroxide is licensed under any of:

at your option.

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

pyro3-0.1.1.tar.gz (22.8 kB view details)

Uploaded Source

Built Distributions

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

pyro3-0.1.1-cp311-cp311-win_amd64.whl (156.3 kB view details)

Uploaded CPython 3.11Windows x86-64

pyro3-0.1.1-cp311-cp311-manylinux_2_34_x86_64.whl (313.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

pyro3-0.1.1-cp311-cp311-macosx_11_0_arm64.whl (274.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file pyro3-0.1.1.tar.gz.

File metadata

  • Download URL: pyro3-0.1.1.tar.gz
  • Upload date:
  • Size: 22.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for pyro3-0.1.1.tar.gz
Algorithm Hash digest
SHA256 e96696628eae29e7706531eef0f6b9e6e8baeb7be79fb28a979331b84da93a53
MD5 5559d751617553e31f3c8fcabb41d3ef
BLAKE2b-256 2db257b327f49fd2c362448e456970ff2d139cd6b3ed28c8249296c71e54fb7a

See more details on using hashes here.

File details

Details for the file pyro3-0.1.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: pyro3-0.1.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 156.3 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for pyro3-0.1.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3443ebe854f8aeb6ca3a74bdd77244a6a4cf9ff5c6b7e697395490c73a4dfa78
MD5 987a93f0652d0d5e222b16da3a2f690a
BLAKE2b-256 196855bb5152759d86f1a79a8d91f81abce56a320bb92b991c9f608bb3964956

See more details on using hashes here.

File details

Details for the file pyro3-0.1.1-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for pyro3-0.1.1-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c336b9d4128d15503fd247b763d43d989ebc3705574c1e71e2f0a1231229cc8b
MD5 b04e96abf853dc5631ac8614abd4e901
BLAKE2b-256 e2027ba8b514d14fe1a84f053b739bff9df66b9a68f5430fdbee5e329f9f9e54

See more details on using hashes here.

File details

Details for the file pyro3-0.1.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyro3-0.1.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c11eeaf7781fe175db661f3e675e8b934bbca6d2c83802ac86730f41b1054b02
MD5 d226e5539243f11eafabaf9f33c71f54
BLAKE2b-256 91e2351e1cff015a13faf97f218843347877eaebc3a292bb5a9abd9ded5739d2

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