straw
Filesystem-based durable queues and shared tensor storage for AI applications.
straw uses a shared filesystem as its storage layer: workers on multiple machines read and write packed data through the same mounted filesystem and exchange small references. Storage and queue protocols run in Rust; Python APIs accept bytes, NumPy arrays and PyTorch tensors.
The current implementation and multi-machine validation focus on JuiceFS shared mounts, accessed through Linux/POSIX filesystem operations. Local filesystems are also used for development and single-machine tests. Support for additional network filesystems, including NFS deployments, is planned; each needs validation of its locking, visibility and durability semantics.
straw currently serves the rollout and training pipelines in slime, including rollout-to-rollout and rollout-to-training queues that share tensor storage. It is an independent AI application library, also suited to preprocessing and inference pipelines. See the design rationale and application integration.
Multi-machine parallel reads and writes
Multiple producers append concurrently to their own packs; readers on other machines access committed immutable extents by reference. The protocol makes payloads durable before publishing references, journals task ownership, accepted results and consumer progress, and coordinates shared ownership and GC through cross-client catalog locks. Reader pins and explicit completion signals protect data until every consumer has finished. See the concurrency rules and protocol.
Avoid the small-file bottleneck
Creating a file for every sample or tensor puts pressure on shared-filesystem metadata operations, especially on NFS. straw packs many records and their manifests into large append-only files, batches publication, and uses fixed append logs for queue metadata. There is no file per sample or tensor. File counts grow with packs and writer lifetimes instead of individual samples; packing and GC control their lifecycle.
Status: early release, Linux/POSIX. One externally fenced coordinator per queue; no automatic leader election or journal/live-pack compaction. Applications must provide real reader-completion signals before reclamation. See filesystem requirements and protocol guarantees.
Install
Install from PyPI:
pip install straw-queue
pip selects a compatible wheel containing the Rust extension.
Installing a wheel does not require Rust or maturin.
NumPy and PyTorch are runtime dependencies; an existing compatible PyTorch
installation can be reused. Distribution name: straw-queue; import: straw.
See supported platforms, offline installation and source builds.
Write, read, keep, reclaim
This complete example uses a private temporary directory. Use a new directory on your shared mount for a real job, with the same run ID on every client.
from tempfile import TemporaryDirectory
from straw import Record, SharedFilesystemStore
with TemporaryDirectory() as root:
with SharedFilesystemStore(root, "example", online_gc=True) as store:
ref = store.publish([Record("message", b"hello")], submission_id="write-1")
store.retain("application:checkpoint-1", [ref])
store.release_publications([ref]) # The checkpoint now owns this data.
assert next(store.read(ref)).payload == b"hello"
store.seal() # Stop appending to this pack before it can be collected.
assert store.collect_garbage()["reclaimed_files"] == 0
store.release("application:checkpoint-1")
assert store.collect_garbage()["reclaimed_files"] == 1
A returned reference is an address, not a permanent lifetime guarantee. Publication staging initially protects it. A queue, checkpoint, explicit owner or reader pin must protect it while it is in use. Garbage collection removes only sealed packs with no remaining owners; closing a writer does not release application ownership. See data and lifetime APIs.
What can I store?
| Data | Write | Read |
|---|---|---|
| Opaque bytes, encoded text, JSON, images or application formats | Record + store.publish |
store.read / read_record, then your decoder |
| NumPy arrays and PyTorch tensors | publish_tensors |
TensorRef.load() or contiguous row slices |
| Several records or tensors forming one result | publish / publish_many |
One RecordSetRef addresses the ordered records |
| Shared immutable data used by several queues | Dependencies and TensorRef.share |
Each queue retains the same underlying packs |
| A changed tensor | TensorRef.updated |
A new tensor; the original remains unchanged |
straw never unpickles stored payloads. Codec names are explicit and versioned; applications own serialization of their custom objects. Tensor helpers copy device data to contiguous CPU storage and support checked row reads. They are not GPU IPC or page-level copy-on-write. Supported types and examples.
Applications may use multiple processes/machines or threads. straw exposes synchronous Rust-backed calls and does not start an I/O process pool itself. See concurrency and writer ownership.
Keep file counts bounded by packs
Reuse a store per writer process. Its default 1 GiB pack contains many publications, including their manifests. Queue metadata uses fixed append logs, and GC uses one shared catalog. There is no file per sample or tensor.
Rotate by bytes, batch small writes with publish_many, release consumed data,
and seal idle writers. A pack containing even one live record remains retained.
Repeated writer restarts, per-sample close()/seal(), or retaining every
checkpoint can still grow storage; the target size is not a global quota.
File-count and retention planning.
Run something small
After installing the wheel, examples from this source tree run directly:
python examples/records.py
python examples/tensors.py
python examples/work_queue.py
python examples/multiprocess.py --root /tmp/new-straw-recovery-run
Run a bounded local benchmark without SSH or GPUs:
python -m straw.benchmark run --local \
--root /tmp/new-straw-benchmark --report benchmark-results/local.json \
--gib 0.0625 --record-bytes 1048576 262144 \
--segment-mib 8 --online-gc --max-files 64 --max-gib 0.25
The benchmark verifies reads, measures durable publication/acceptance latency, reports bytes and file counts, and removes its temporary payload root after workers stop. Multi-host benchmarks and trace replay.
Read next
- Rationale and architecture
- Records, tensors, tasks, recovery and GC
- Filesystem deployment and file-count planning
- Protocol, prior work and correctness boundaries
- Executable verification and binary format
- Wheel builds and release checks
- Release notes
- Application integration and contributing
Build and test on GitHub
- Full tests: Rust tests, formatting and Clippy, plus the complete Python suite, ownership model, crash campaign, examples and bounded I/O/GC benchmark against installed wheels on CPython 3.10–3.13.
- Wheels: build and verify Linux x86_64 wheels for CPython 3.10–3.13 (manylinux/glibc 2.28+), plus a source archive and rebuild check. Download the outputs from the run's Artifacts section. Version-tag pushes publish the verified artifacts to PyPI through Trusted Publishing.
Both workflows support Actions → select workflow → Run workflow. Tests also
run on pushes and pull requests; wheels run on pull requests and v* tags.
Hosted CI uses a local filesystem and CPU PyTorch; deployment qualification on
multiple JuiceFS clients and GPU training use separate checks.
See build and release instructions.
License
MIT.
Release files for straw-queue 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| straw_queue-0.1.0.tar.gz | 167.3 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| straw_queue-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.28+ x86-64 | Details |
| straw_queue-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.28+ x86-64 | Details |
| straw_queue-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.28+ x86-64 | Details |
| straw_queue-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl | CPython 3.10 | CPython 3.10 | Linux glibc 2.28+ x86-64 | Details |
Total release size: 2.8 MB
Release files / straw_queue-0.1.0.tar.gz
| Download URL | straw_queue-0.1.0.tar.gz |
|---|---|
| Size | 167.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e69e812658da5a4db13656339bb2469b1084ad7a897b13f9df123dc280ee7b92
|
|
BLAKE2b-256 checksum How to use checksums |
2575b3c83bb0adf60732d9cb84ae0e424f9612db455fd01bc21427a4d6d2ef6b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / straw_queue-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl
| Download URL | straw_queue-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 654.5 kB |
| Tags | CPython 3.13 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
69a4ca66046cd35ad4a440ad7a101aebea823f52eeb4334a1285fdfb1acf9e73
|
|
BLAKE2b-256 checksum How to use checksums |
b4f16cd20ddbf0a35957b0bccab5683c40221e560327e114f0d3c909347f6130
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / straw_queue-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl
| Download URL | straw_queue-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 656.0 kB |
| Tags | CPython 3.12 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
30bc62455f4cd3dd75022e98b4504ae9737b26ba1edab090e57cd394565253c2
|
|
BLAKE2b-256 checksum How to use checksums |
73737f33bbd7f9bae06a581d0ccbe8847262353efa303279a4cedff91abc2e55
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / straw_queue-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl
| Download URL | straw_queue-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 655.9 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
1eb6fda06d0dc070a24726a27b6193c919e7fbd451443f2f62dc219e917c57e2
|
|
BLAKE2b-256 checksum How to use checksums |
c252d517e159e0a9f7c3de013cd52fdff8d0480497f1ac427570a98a6998b2f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / straw_queue-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl
| Download URL | straw_queue-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 655.7 kB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
65f07112680810635346726ec9abd7cecb131c17d3a90c2a38db3f26c9d2d15b
|
|
BLAKE2b-256 checksum How to use checksums |
521eab941f0f7f0a7bc132b3a8643ee64f3f18d43ae2e400764a38f1e3cbdcd2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency log