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

#713 in Asynchronous

Download history 11650/week @ 2024-10-13 11834/week @ 2024-10-20 10570/week @ 2024-10-27 7790/week @ 2024-11-03 6925/week @ 2024-11-10 7262/week @ 2024-11-17 6562/week @ 2024-11-24 8276/week @ 2024-12-01 7823/week @ 2024-12-08 6644/week @ 2024-12-15 4355/week @ 2024-12-22 6673/week @ 2024-12-29 9779/week @ 2025-01-05 11287/week @ 2025-01-12 12724/week @ 2025-01-19 11022/week @ 2025-01-26

45,319 downloads per month
Used in 69 crates (6 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
~120K SLoC