#interrupt #async #future #points #check #interruptible #threads-fibers

tokio-interruptible-future

Easily interrupt async code in given check points. It's useful to interrupt threads/fibers.

27 releases (8 major breaking)

8.2.0 Jul 27, 2022
8.0.0 Feb 20, 2022
7.0.0 Feb 20, 2022
6.0.0 Feb 20, 2022
0.11.2 Feb 12, 2022

#31 in #interrupt

Download history 41/week @ 2024-04-13 19/week @ 2024-06-29 311/week @ 2024-07-06 224/week @ 2024-07-27

535 downloads per month
Used in 2 crates

Apache-2.0

7KB
108 lines

tokio-interruptible-future

Easily interrupt async code in given check points. It's useful to interrupt threads/fibers.

DISCLAIMER: Not enough tested.

TODO: Add documentation.

Recommended to use together with tokio-notify-drop.

#[derive(Debug, PartialEq, Eq)]
enum MyError {
    Interrupted(InterruptError),
}
impl From<InterruptError> for MyError {
    fn from(value: InterruptError) -> Self {
        Self::Interrupted(value)
    }
}
struct Test {
    interrupt_notifier: Notify,
}
impl Interruptible for Test {
    fn interrupt_notifier(&self) -> &Notify {
        &self.interrupt_notifier
    }
}
impl Test {
    pub fn new() -> Self {
        Self {
            interrupt_notifier: Notify::new()
        }
    }
    pub async fn f(&self) -> Result<(), MyError> {
        self.interruptible/*::<(), MyError>*/(async {
            loop {
                self.interrupt(); // In real code called from another fiber or another thread.
                self.check_for_interrupt::<MyError>().await?;
            }
        }).await
    }
    pub async fn g(&self) -> Result<u8, MyError> {
        self.interruptible::<u8, MyError>(async {
            Ok(123)
        }).await
    }
}

Dependencies

~3–5MB
~84K SLoC