drop-queue

Crates.iodrop-queue
lib.rsdrop-queue
version0.0.4
created_at2025-07-22 20:17:16.318685+00
updated_at2025-07-22 20:23:43.228019+00
descriptiondrop-queue, is a simple drop queue system for async operations. (Until async-drop is a thing)
homepage
repositoryhttps://github.com/kjuulh/drop-queue
max_upload_size
id1763953
size27,676
Kasper Juul Hermansen (kjuulh)

documentation

README

๐ŸงŠ drop-queue

drop-queue is a simple, composable async drop queue for Rust โ€” built to run queued tasks in FIFO order and ensure graceful shutdown via draining. It's useful in lifecycle-managed environments (e.g., notmad) or as a lightweight alternative until async drop is stabilized in Rust.

๐Ÿ’ก Tasks are executed one at a time. If the queue is marked for draining, no further items can be added.


โœจ Features

  • Assign one-off async tasks (closures) to a queue
  • FIFO task processing
  • Draining mechanism to flush the queue before shutdown
  • Optional integration with notmad for graceful component lifecycle control
  • Send + Sync + 'static guaranteed

๐Ÿš€ Usage

Add to Cargo.toml

[dependencies]
drop-queue = "*"

Enable notmad integration (optional)

[dependencies]
drop-queue = { version = "*", features = ["notmad"] }

๐Ÿ›  Example

use drop-queue::DropQueue;
use tokio::sync::oneshot;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let queue = DropQueue::new();

    let (tx, rx) = oneshot::channel();

    queue.assign(|| async move {
        println!("Running closure task");
        tx.send(()).unwrap();
        Ok(())
    })?;

    queue.process_next().await?;

    rx.await?;

    Ok(())
}

๐Ÿ” Lifecycle with notmad

If using the notmad lifecycle framework:

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let queue = drop-queue::DropQueue::new();
    let app = notmad::Mad::new().add(queue);
    app.run().await?;
    Ok(())
}

This will process tasks until the cancellation token is triggered, e.g., via SIGINT.


๐Ÿ”’ Drain Mode

You can signal the queue to stop accepting new items and finish processing the current ones:

queue.drain().await?;

After this call, any further assign() will panic.


๐Ÿงช Tests

Run the test suite using:

cargo test

๐Ÿ“œ License

MIT

Commit count: 0

cargo fmt