7 releases

0.3.4 Oct 11, 2023
0.3.3 Sep 30, 2023
0.2.0 Sep 22, 2023
0.1.0 Sep 22, 2023

#19 in #background-task

Download history 5/week @ 2024-09-23 1/week @ 2024-09-30

86 downloads per month

MIT license

13KB
315 lines

Rasks

Usage

use rasks::{ExecutionSchedule, Executor, MemoryExecutor};
use std::sync::{Arc, Mutex};
use std::time::{Duration, Instant};

pub struct Arg1 {
    pub a: String,
}

fn main() {
    let mut executor = MemoryExecutor::new();

    let task = |(arg1, _): &(Arc<Mutex<&str>>, u32)| {
        let mut arg = arg1.lock().expect("poisoned mutex");
        *arg = "new";
        println!("Running @ {:?}", Instant::now());
        // task closures should return anyhow::Result<()>
        Ok(())
    };

    let clonable_state = Arc::new(Mutex::new("old"));
    let task_id = executor
        .launch(
            task,
            (clonable_state, 1),
            ExecutionSchedule::Every(Duration::from_secs(10)),
            None,
        )
        .unwrap();
    executor.join_task(&task_id).unwrap()
}

Async

If your app is running on the tokio runtime you can use the async executor

use rasks::{BoxPinnedFuture, ExecutionSchedule, AsyncExecutor, AsyncMemoryExecutor};
use std::time::Duration;
use std::sync::Arc;

#[derive(Clone)]
pub struct Arg1 {
    pub a: i32,
}


pub struct Arg2 {
    pub a: i32,
}
#[tokio::main]
async fn main() {
    let mut executor = AsyncMemoryExecutor::new();
    fn task1((arg1, arg2): &(Arc<Arg1>, Arg2)) -> BoxPinnedFuture<'_> {
        Box::pin(async {
            tokio::time::sleep(Duration::from_secs(2)).await;
            assert_eq!(arg1.a, 10);
            assert_eq!(arg2.a, 20);
            Ok(())
        })
    }

    let task_id = executor
        .launch(
            task1,
            (Arc::new(Arg1 { a: 10 }), Arg2 { a: 20 }),
            ExecutionSchedule::Once(Duration::from_secs(2), false),
            None,
        )
        .await
        .unwrap();

    executor.join_task(&task_id).await.unwrap();
    println!("Done");

}

Dependencies

~3.5–9.5MB
~91K SLoC