Skip to main content

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.

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)

Source distribution for straw-queue 0.1.0
File Size Uploaded
straw_queue-0.1.0.tar.gz 167.3 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for straw-queue 0.1.0
File
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 log

Release 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 log

Release 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 log

Release 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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.0 This release

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page