#task #async-std #duration #stream

stop-token

Experimental cooperative cancellation for async Rust

16 releases (6 breaking)

0.7.0 Jan 19, 2022
0.6.1 Oct 28, 2021
0.5.1 Oct 15, 2021
0.4.1 Oct 15, 2021
0.1.2 Nov 12, 2019

#543 in Asynchronous

Download history 7674/week @ 2024-12-09 6820/week @ 2024-12-16 3892/week @ 2024-12-23 7248/week @ 2024-12-30 9524/week @ 2025-01-06 11479/week @ 2025-01-13 12485/week @ 2025-01-20 11795/week @ 2025-01-27 13729/week @ 2025-02-03 11691/week @ 2025-02-10 13429/week @ 2025-02-17 14708/week @ 2025-02-24 16761/week @ 2025-03-03 18018/week @ 2025-03-10 14085/week @ 2025-03-17 13594/week @ 2025-03-24

63,665 downloads per month
Used in 75 crates (5 directly)

MIT/Apache

24KB
386 lines

stop-token

Cooperative cancellation for async Rust

See crate docs for details

You can use this crate to create a deadline received through a StopToken:

use async_std::prelude::*;
use async_std::{stream, task};

use stop_token::prelude::*;
use stop_token::StopSource;

use std::time::Duration;

#[async_std::main]
async fn main() {
    // Create a stop source and generate a token.
    let src = StopSource::new();
    let deadline = src.token();

    // When stop source is dropped, the loop will stop.
    // Move the source to a task, and drop it after 100 millis.
    task::spawn(async move {
        task::sleep(Duration::from_millis(100)).await;
        drop(src);
    });

    // Create a stream that generates numbers until
    // it receives a signal it needs to stop.
    let mut work = stream::repeat(12u8).timeout_at(deadline);

    // Loop over each item in the stream.
    while let Some(Ok(ev)) = work.next().await {
        println!("{}", ev);
    }
}

Or Instant to create a time-based deadline:

use async_std::prelude::*;
use async_std::stream;

use stop_token::prelude::*;

use std::time::{Instant, Duration};

#[async_std::main]
async fn main() {
    // Create a stream that generates numbers for 100 millis.
    let deadline = Instant::now() + Duration::from_millis(100);
    let mut work = stream::repeat(12u8).timeout_at(deadline);

    // Loop over each item in the stream.
    while let Some(Ok(ev)) = work.next().await {
        println!("{}", ev);
    }
}

Dependencies

~0.4–11MB
~129K SLoC