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 »

API Reference · See Examples · Report Bug · Request Feature


Pyroxide (pyro3) is a lightweight, ultra-high-performance 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.

Why Pyroxide?

  • 🚀 Bypass the GIL (GIL-Free): Execute CPU-intensive compiled tasks on background OS threads without holding the Python GIL.
  • Microsecond Latency: Utilizes OS-level signaling (Condvar) rather than CPU-burning thread polling, dispatching and completing tasks in under 25 microseconds.
  • 📦 Zero Infrastructure: Runs completely in-process. No Redis, RabbitMQ, or Celery worker daemons to configure or maintain.
  • 💾 Zero-Copy Serialization: Pass large byte arrays, memoryviews, or columnar buffers across the C-ABI boundary without copy or pickle overhead.
  • 🛠️ On-the-Fly Native Compilers: Write code as Python strings and compile them to dynamic libraries on-the-fly (Rust, C, and Zig supported!).
  • 🛡️ Isolated Worker Processes: Opt-in isolated=True to run tasks in separate processes via ultra-fast Unix Domain Sockets for 100% crash safety and pure Python GIL bypass.

Pyroxide vs. Alternatives

Feature / Metric Pyroxide Threading (std) Multiprocessing Celery / RQ
GIL Bypass ✅ Yes (WASM/dylib) ❌ No ✅ Yes ✅ Yes
IPC / Serialization ✅ None (Shared Memory) ✅ None ❌ High (Pickling) ❌ High (Network/Redis)
Infrastructure ✅ None (Embedded) ✅ None ⚠️ Low (Spawns processes) ❌ High (Redis/RabbitMQ)
Best For 🔥 High-perf in-process pipelines I/O-bound Python CPU-heavy Python Distributed tasks

For a detailed analysis, check out the Library Comparison Guide.


Installation

From PyPI

pip install pyro3

Build Locally

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

git clone https://github.com/emivvvvv/pyroxide.git
cd pyroxide
pip install maturin
maturin develop

Quick Start

1. Offload Python Callables

from pyroxide import task

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

# Submit and get a handle immediately
handle = calculate_square(12)
result = handle.result() # Blocks natively (0% CPU) until complete
print(result) # 144

# Pure Python tasks can fully bypass the GIL with `isolated=True`
@task(isolated=True)
def heavy_computation(x: int) -> int:
    return sum(i * i for i in range(x))

2. Sandboxed WebAssembly (GIL-Free)

Run computations GIL-free in a secure, virtual sandbox without compiling native code:

from pyroxide import register_wasm, wasm_task

# 1. Register WebAssembly bytecode
with open("rot13.wasm", "rb") as f:
    register_wasm("rot13", f.read())

# 2. Decorate stub function
@wasm_task("rot13")
def rot13_cipher(payload: str) -> str:
    pass

# 3. Execute GIL-free on the Rust worker pool!
print(rot13_cipher("hello").result()) # "uryyb"

3. Dynamic Shared Libraries (On-the-Fly Compilation)

Compile and load native code strings on-the-fly. Rust (compile_dylib), C (compile_c), and Zig (compile_zig) are supported:

from pyroxide import compile_dylib, dylib_task

RUST_SRC = """
#[no_mangle]
pub unsafe extern "C" fn pyroxide_plugin_run(ptr: *const u8, len: usize, out_len: *mut usize) -> *mut u8 {
    let input = std::slice::from_raw_parts(ptr, len);
    let s = std::str::from_utf8(input).unwrap_or("");
    let result = s.to_uppercase().into_bytes();
    *out_len = result.len();
    let boxed = result.into_boxed_slice();
    Box::into_raw(boxed) as *mut u8
}

#[no_mangle]
pub unsafe extern "C" fn pyroxide_plugin_free(ptr: *mut u8, len: usize) {
    let _ = Box::from_raw(std::slice::from_raw_parts_mut(ptr, len));
}
"""

# Compile, register and load the Rust library on-the-fly!
compile_dylib("rust_upper", RUST_SRC)

@dylib_task("rust_upper")
def to_upper_rust(payload: str) -> str:
    pass

print(to_upper_rust("hello from rust").result())  # "HELLO FROM RUST"

Dive Deeper (Documentation Book)

Detailed documentation, guides, and implementation examples are available in our Documentation Book:

  • Asynchronous Event Loops: Non-blockingly await tasks using await handle.result_async() in FastAPI/asyncio. Read Chapter.
  • Isolated Worker Processes: Sandbox tasks in separate OS processes for crash safety and GIL bypass. Read Chapter.
  • Batch Submissions: Submit multiple tasks under a single lock acquisition to avoid thread contention. Read Chapter.
  • Task Cancellation: Gracefully abort long-running background tasks mid-flight. Read Chapter.
  • Traceback Preservation: Capture stack traces on background worker threads and propagate them to the main thread. Read Chapter.
  • Memory Footprint & GC: Learn how Slab memory is reclaimed automatically using GC destructors. Read Chapter.

Performance At-a-Glance

We benchmarked Pyroxide against CPython's standard concurrency pools using identical compute payloads (recursive Fibonacci 20 workload) on Apple M1 Pro (8 cores, 16GB RAM):

Metric (500 Tasks) Pyroxide @dylib_task Pyroxide @task Threading (std) Multiprocessing
Execution Time 0.0200 s 0.3878 s 0.3742 s 2.0786 s
GIL Bypass ✅ Yes (GIL-Free) ❌ No ❌ No ✅ Yes
IPC / Serialization ✅ None (Shared Memory) ✅ None ✅ None ❌ High (pickle cost)
Relative Speedup 🔥 100x faster (18x faster than threads) 5x faster 5x faster Baseline (1x)
  • Bypassing the Multiprocessing Bottleneck: While Python's ProcessPoolExecutor takes over 2 seconds due to slow process spawning and heavy pickle IPC serialization, Pyroxide's @dylib_task runs native compiled plugins in just 20 milliseconds—offering a 100x speedup with zero-copy shared memory.

To run the comparative and basic benchmark suites locally:

# 1. Run detailed comparative benchmarks against CPython concurrency pools
python examples/benchmark_vs_alternatives.py

# 2. Run basic scheduling latency and asyncio benchmarks
python examples/benchmark.py

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.4.0.tar.gz (70.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.4.0-cp38-abi3-win_amd64.whl (3.3 MB view details)

Uploaded CPython 3.8+Windows x86-64

pyro3-0.4.0-cp38-abi3-manylinux_2_39_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.39+ x86-64

pyro3-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.0 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

pyro3-0.4.0-cp38-abi3-macosx_11_0_arm64.whl (3.7 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

pyro3-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for pyro3-0.4.0.tar.gz
Algorithm Hash digest
SHA256 18e260132cbc03d9633bad7537c9a7c3be0799f2792ff3738ee4ad6674ddd002
MD5 5ebc97f3ce691ee269cca96a19d4be30
BLAKE2b-256 58862332b3193522ee121752ddb3b1d63e8e374a93e872cb0efcc46e57629c9b

See more details on using hashes here.

File details

Details for the file pyro3-0.4.0-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: pyro3-0.4.0-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 3.3 MB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for pyro3-0.4.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 e468dd30f540d5e6eeec1397da5dd18f4408d5c24c02681954941ed06cd1f8c1
MD5 d65bbc1bc0c0ab13a6d1d2264bad182b
BLAKE2b-256 3a0a3b92c01c30051f42a707aa0d47c8d7d952a5f052a538e745430ea9ee677a

See more details on using hashes here.

File details

Details for the file pyro3-0.4.0-cp38-abi3-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for pyro3-0.4.0-cp38-abi3-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 e02e37fea0efa90d79b0c38212139c76fb6ea945dfb9a2887cce6a0377dd6c70
MD5 513a785c08bdb29fc064d21f305e1269
BLAKE2b-256 e0327c5289b7de10d6605238d2adce4ee42b31af10b60df097afbf728d6435e9

See more details on using hashes here.

File details

Details for the file pyro3-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyro3-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9bf9ec4716fda976ad448721f49672e5719ff7b0bb8d957c8ca8da461a3bc6d8
MD5 e612cf57e5fcd32cda62b0009d6257fe
BLAKE2b-256 e0d6c79966b8b01467bf5174aec66d748bd2afd6adaab578fe23d67d6b1f6910

See more details on using hashes here.

File details

Details for the file pyro3-0.4.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyro3-0.4.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cba1f17bd2a1d154b48cc6b64d90bf39391e11abaf8a5f023bf45bcc76b55d20
MD5 a94eb6bbdb989dafe6a3e9468f7dea98
BLAKE2b-256 c3199850323d539b19551fa1858a8639994e28132fe19ec94b4b5a24e0851c36

See more details on using hashes here.

File details

Details for the file pyro3-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyro3-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5cffa58bda8def7dac537db7266e8f3c54c484798b9370a07a7184133c605a26
MD5 ab47610dbbe8804cd6597e056c2f5ad3
BLAKE2b-256 8c1cfa5e3712f5fea4774d818fe1e240ceb9285c120978f3a5df287ead791a8f

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