async-cron-scheduler

Crates.ioasync-cron-scheduler
lib.rsasync-cron-scheduler
version2.0.1
sourcesrc
created_at2022-04-26 11:44:33.342793
updated_at2024-01-10 12:47:29.661913
descriptionRuntime-agnostic async task scheduler with cron expression support
homepage
repositoryhttps://github.com/pop-os/async-cron-scheduler
max_upload_size
id575331
size63,943
Michael Murphy (mmstick)

documentation

README

async-cron-scheduler

Runtime-agnostic async task scheduler with cron expression support

  • Lightweight: Minimal dependencies because it does not rely on a runtime.
  • Efficient: Tickless design with no reference counters.
  • Runtime-Agnostic: Bring your own runtime. No runtime dependencies.
  • Async: A single future drives the entire scheduler service.
  • Task Scheduling: Schedule multiple jobs with varying timeframes between them.
  • Cron Expressions: Standardized format for scheduling syntax.

Demo

use chrono::offset::Local;
use async_cron_scheduler::*;
use smol::Timer;
use std::time::Duration;

smol::block_on(async move {
    // Creates a scheduler based on the Local timezone. Note that the `sched_service`
    // contains the background job as a future for the caller to decide how to await
    // it. When the scheduler is dropped, the scheduler service will exit as well.
    let (mut scheduler, sched_service) = Scheduler::<Local>::launch(Timer::after);

    // Creates a job which executes every 1 seconds.
    let job = Job::cron("1/1 * * * * *").unwrap();
    let fizz_id = scheduler.insert(job, |id| println!("Fizz")).await;

    // Creates a job which executes every 3 seconds.
    let job = Job::cron("1/3 * * * * *").unwrap();
    let buzz_id = scheduler.insert(job, |id| println!("Buzz")).await;

    // Creates a job which executes every 5 seconds.
    let job = Job::cron("1/5 * * * * *").unwrap();
    let bazz_id = scheduler.insert(job, |id| println!("Bazz")).await;

    // A future which gradually drops jobs from the scheduler.
    let dropper = async move {
        Timer::after(Duration::from_secs(7)).await;
        scheduler.remove(fizz_id).await;
        println!("Fizz gone");
        Timer::after(Duration::from_secs(5)).await;
        scheduler.remove(buzz_id).await;
        println!("Buzz gone");
        Timer::after(Duration::from_secs(1)).await;
        scheduler.remove(bazz_id).await;
        println!("Bazz gone");

        // `scheduler` is dropped here, which causes the sched_service to end.
    };

    // Poll the dropper and scheduler service concurrently until both return.
    futures::future::join(sched_service, dropper).await;
});

License

Licensed under the Mozilla Public License 2.0.

Contribution

Any contribution intentionally submitted for inclusion in the work by you shall be licensed under the Mozilla Public License 2.0 (MPL-2.0).

Commit count: 0

cargo fmt