Task Scheduler in Rust: Library Overview and Implementation

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Task Scheduler in Rust: A Complete Guide to Libraries and Implementation



In modern server application and automation system development, the task scheduler is one of the key components. Rust, thanks to its performance and memory safety, offers several powerful solutions for creating flexible and efficient schedulers. In this article, we will take a detailed look at the main libraries for task scheduling in Rust, their capabilities, usage examples, and a comparison with Python counterparts.



Main Libraries for Task Scheduling in Rust



The Rust ecosystem offers several mature solutions for working with task schedulers. Let's look at the three most popular libraries:



  • tokio-schedule — an asynchronous scheduler based on tokio, supporting cron expressions and interval tasks
  • cron — a lightweight library for working with cron expressions, often used together with tokio
  • async-task-scheduler — a high-level scheduler with support for priorities, retries, and complex launch rules


Installing and Configuring tokio-schedule



To get started, add the dependencies to your Cargo.toml:



[dependencies]tokio = { version = "1.0", features = ["full"] }tokio-schedule = "0.4"chrono = "0.4"


Example 1: Simple Interval Scheduler



Let's create a basic scheduler that runs a task every 5 seconds:



use tokio::time::{sleep, Duration};use tokio_schedule::Job;

#[tokio::main]async fn main() { // Create a task that runs every 5 seconds let job = Job::new() .every(Duration::from_secs(5)) .run(|| async { println!("Task executed at: {}", chrono::Local::now()); });

println!("Scheduler started. Press Ctrl+C to stop."); job.start().await; // Infinite wait loop { sleep(Duration::from_secs(1)).await; }}


Example 2: Scheduler with a Cron Expression



A more complex example using cron syntax for precise execution time control:



use tokio_schedule::Job;use std::sync::Arc;use std::sync::atomic::{AtomicU64, Ordering};

#[tokio::main]async fn main() { let counter = Arc::new(AtomicU64::new(0)); let counter_clone = counter.clone();

// Run every minute at 30 seconds let job = Job::new() .cron("30 * * * * *") // second, minute, hour, day, month, day_of_week .run(move || { let cnt = counter_clone.fetch_add(1, Ordering::SeqCst); async move { println!("[{}] Task execution at: {}", cnt, chrono::Local::now()); // Your business logic can go here simulate_work().await; } });

println!("Cron scheduler started."); job.start().await;

// Demonstration of work for 2 minutes tokio::time::sleep(Duration::from_secs(120)).await;}

async fn simulate_work() { // Simulate work tokio::time::sleep(Duration::from_millis(500)).await;}


Example 3: Scheduler with Multiple Tasks and Priorities



Using the async-task-scheduler library to manage multiple tasks:



use async_task_scheduler::{Scheduler, Task, Priority};use std::time::Duration;

#[tokio::main]async fn main() { let mut scheduler = Scheduler::new();

// High-priority task — runs every 2 seconds scheduler.add_task( Task::new("high_priority_task", || async { println!("[HIGH] Urgent task executed"); }) .interval(Duration::from_secs(2)) .priority(Priority::High) );

// Low-priority task — ru

Recommendations