spsc-ring-threadsafe
Lockless, thread-safe, single-producer, single-consumer, FIFO queue for Python — implemented on a ring buffer in C.
Design
Built on a Lamport ring buffer with C11 _Atomic read/write indexes (acquire/release ordering). Producer and consumer never contend with eachother.
Features:
- Single producer, single consumer, FIFO semantics
- Lockless (no mutexes or spinlocks)
- Non-blocking / async-friendly
- Suitable for shared memory and IPC
- Compatible with no-GIL & subinterpreters
- Low overhead, especially for small messages
- Up to 100x faster than
multiprocessing.Queuein the standard library
Benchmarks
Quick Start
import spsc_ring_threadsafe as srt
buf = bytearray(4096)
srt.init(buf) # initialize as ring buffer
item = b"this is a bytestring message"
srt.put(buf, item)
result = srt.get(buf)
print(result.decode())
Output:
this is a bytestring message
Shared Memory
from multiprocessing import shared_memory
import spsc_ring_threadsafe as srt
shm_name = "app_123456"
# Process 1 (producer)
a = shared_memory.SharedMemory(create=True, size=4096, name=shm_name)
srt.init(a.buf) # initialize as ring buffer
item = b"hello from shared memory!"
srt.put(a.buf, item)
a.close()
# Process 2 (consumer)
b = shared_memory.SharedMemory(name=shm_name)
result = srt.get(b.buf)
print(result.decode())
b.close()
b.unlink()
Output:
hello from shared memory!
API Reference
Exceptions
| Exception | Raised when |
|---|---|
spsc_ring_threadsafe.QueueFullError |
put() called on a full buffer |
spsc_ring_threadsafe.QueueEmptyError |
get() called on an empty buffer |
Functions
spsc_ring_threadsafe.init(buf)
Initialize a mutable buffer as a ring buffer (this function sets the read + write indexes to zero).
| Parameter | Description |
|---|---|
buf |
Mutable buffer-compatible object (bytearray, memoryview, etc.). Size must be a power-of-two anywhere from 256 bytes to 2 GiB. Also accepts shared memory buffers. |
⚠️ Thread safety: Initialization is not thread-safe. Initialize once before any concurrent access, or provide your own synchronization.
spsc_ring_threadsafe.put(buf, item)
Insert an item into the ring buffer. Non-blocking.
| Parameter | Description |
|---|---|
buf |
Mutable buffer-compatible object. Size must be a power-of-two anywhere from 256 bytes to 2 GiB. Also accepts shared memory buffers. |
item |
Buffer-compatible object to insert |
Raises: QueueFullError if the buffer has insufficient space.
⚠️ Buffer must be zeroed or initialized before use.
⚠️ Thread safety: Only a single producer is allowed for a given queue! Multiple producers are NOT thread-safe.
spsc_ring_threadsafe.get(buf)
Remove and return an item from the ring buffer. Non-blocking.
| Parameter | Description |
|---|---|
buf |
Mutable buffer-compatible object. Size must be a power-of-two anywhere from 256 bytes to 2 GiB. Also accepts shared memory buffers. |
Returns: Buffer-compatible object containing the message.
Raises: QueueEmptyError if no message is available.
⚠️ Buffer must be zeroed or initialized before use.
⚠️ Thread safety: Only a single consumer is allowed for a given queue! Multiple consumers are NOT thread-safe.
Installation
uv add spsc-ring-threadsafe
or
pip install spsc-ring-threadsafe
Development
Run tests
uv run python -m unittest discover -s tests -v
Run benchmarks
uv pip install -e . --force-reinstall --no-deps
uv run python tests/benchmark.py
Run dev script
uv pip install -e . --force-reinstall --no-deps
uv run python tests/dev.py
LLM Usage Disclosure
Tests and benchmarks were written with assistance from AI models. All C code is written by hand.
Metadata
Release files for spsc-ring-threadsafe 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| spsc_ring_threadsafe-0.1.1.tar.gz | 9.3 kB | Without provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| spsc_ring_threadsafe-0.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl | CPython 3.14 | CPython 3.14 free-threading | Linux glibc 2.28+ x86-64, Linux glibc 2.17+ x86-64 | Details |
| spsc_ring_threadsafe-0.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl | CPython 3.14 | CPython 3.14 free-threading | Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| spsc_ring_threadsafe-0.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.28+ x86-64, Linux glibc 2.17+ x86-64 | Details |
| spsc_ring_threadsafe-0.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 | Details |
Total release size: 90.4 kB
Release files / spsc_ring_threadsafe-0.1.1.tar.gz
| Download URL | spsc_ring_threadsafe-0.1.1.tar.gz |
|---|---|
| Size | 9.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e0f38a49ce0284c819929f3a3cd5fc6406bf494738a5af20e8c9d113787a1f55
|
|
BLAKE2b-256 checksum How to use checksums |
21087880997e254b5ba71b4c3f9337234fd8b69dc17effa845a113a03d9e869e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / spsc_ring_threadsafe-0.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | spsc_ring_threadsafe-0.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 20.1 kB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
5f4e5a1cbcdf2920229cb73cbc9077fa1ba78ca7e21b8e7b3504ca9f959a41c1
|
|
BLAKE2b-256 checksum How to use checksums |
ef150bff65827ea74dcf562fb01b1ee8a10bcfc656a7051160287f78caa1070e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / spsc_ring_threadsafe-0.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | spsc_ring_threadsafe-0.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 21.2 kB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
dcbd269e4846efa4361d264bff937032d46ec0359d933c2918360c9de472b5eb
|
|
BLAKE2b-256 checksum How to use checksums |
b2e9686178905648395103745757ac9259cf4d9d3597185c3f3d93e632ea0f92
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / spsc_ring_threadsafe-0.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | spsc_ring_threadsafe-0.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 19.4 kB |
| Tags | CPython 3.14 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
6b524552339b768fc643a438678df63a90ae7140c18769b70849198c8ed1d310
|
|
BLAKE2b-256 checksum How to use checksums |
642632d204bfe33facd0f0145b84fa45d70de62a9bc75cf3f351be32a0804dbd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / spsc_ring_threadsafe-0.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | spsc_ring_threadsafe-0.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 20.3 kB |
| Tags | CPython 3.14 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
e89b87408d8aad9d6f972628cbcd72752610814f80159d4b14dbbc2c859f281c
|
|
BLAKE2b-256 checksum How to use checksums |
4331098fcdc1f7c648e1897426ed8a238cb33ae77b00e5dbc1a8893d4f7cb355
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for spsc-ring-threadsafe 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.