12 unstable releases (3 breaking)

0.7.0 Nov 22, 2024
0.6.4 Oct 22, 2024
0.6.2 Jul 27, 2024

#417 in Asynchronous

Download history 109/week @ 2024-09-02 15/week @ 2024-09-09 47/week @ 2024-09-16 42/week @ 2024-09-23 92/week @ 2024-09-30 42/week @ 2024-10-07 160/week @ 2024-10-21 2/week @ 2024-10-28 4/week @ 2024-11-04 134/week @ 2024-11-18 99/week @ 2024-11-25 54/week @ 2024-12-02

287 downloads per month

MIT license

165KB
3.5K SLoC

SACS - Simple Asynchronous Cron Scheduler

SACS is easy to use, lightweight scheduler and executor of repeatable async tasks for Tokio runtime.

CI status Audit status Crates.io publishing status docs.rs status Version at Crates.io License

Features

  • Runs tasks with different types of schedule: once, with delay, by interval, with a cron schedule.
  • Uses current Tokio runtime or creates new one with specified type, number of threads and limited parallelism.
  • Allows task cancellation, getting current state and runtime statistics of the task.
  • Task execution time may be limited.
  • Lightweight, small, easy to use.

Quick start

Just create Scheduler and add Task to it. Refer to the crate's documentation for more examples and details of possible usage.

use sacs::{
    scheduler::{Scheduler, ShutdownOpts, TaskScheduler},
    task::{CronOpts, Task, TaskSchedule},
    Result,
};
use std::time::Duration;
use tracing::info;

#[tokio::main]
async fn main() -> Result<()> {
    tracing_subscriber::fmt::init();

    // Create scheduler with default config
    let scheduler = Scheduler::default();

    // Create task with cron schedule: repeat it every 3 seconds
    let cron = TaskSchedule::Cron("*/3 * * * * *".try_into()?, CronOpts::default());
    let task = Task::new(cron, |id| {
        Box::pin(async move {
            info!("Job {id} started.");
            // Actual async workload here
            tokio::time::sleep(Duration::from_secs(2)).await;
            // ...
            info!("Job {id} finished.");
        })
    });

    // Post task to the scheduler and forget it :)
    let _task_id = scheduler.add(task).await?;

    // ... and do any other async work in parallel
    tokio::time::sleep(Duration::from_secs(10)).await;

    // It's not mandatory but good to shutdown scheduler
    // Wait for completion of all running jobs
    scheduler.shutdown(ShutdownOpts::WaitForFinish).await
}

TODO

  • Make TaskId and JobId more flexible and convenient to create and refer tasks.
  • Tracing.
  • Task with limited execution time.
  • More examples.

License

This project is licensed under the MIT license.

Dependencies

~6–15MB
~183K SLoC