基于 Rust 的任务调度器:库与实现完整指南
在现代服务器应用和自动化系统开发中,任务调度器 (task scheduler) 是核心组件之一。Rust 凭借其高性能和内存安全性,提供了多种强大解决方案来创建灵活高效的调度器。本文将详细介绍 Rust 中用于任务调度的主要库、它们的功能、使用示例以及与 Python 同类库的对比。
Rust 中用于任务调度的主要库
Rust 生态系统提供了多个成熟的调度器解决方案。我们来看三个最流行的库:
- tokio-schedule — 基于 tokio 的异步调度器,支持 cron 表达式和间隔任务
- cron — 轻量级库,用于处理 cron 表达式,常与 tokio 配合使用
- async-task-scheduler — 高级调度器,支持优先级、重试和复杂启动规则
安装和配置 tokio-schedule
首先,将依赖项添加到您的 Cargo.toml 文件中:
[dependencies]tokio = { version = "1.0", features = ["full"] }tokio-schedule = "0.4"chrono = "0.4"示例 1:简单的间隔调度器
创建一个每 5 秒执行一次任务的基本调度器:
use tokio::time::{sleep, Duration};use tokio_schedule::Job;
#[tokio::main]async fn main() { // 创建一个每 5 秒执行的任务 let job = Job::new() .every(Duration::from_secs(5)) .run(|| async { println!("任务执行时间:{}", chrono::Local::now()); });
println!("调度器已启动。按 Ctrl+C 停止。"); job.start().await; // 无限等待 loop { sleep(Duration::from_secs(1)).await; }}示例 2:使用 cron 表达式的调度器
更复杂的示例,使用 cron 语法精确控制执行时间:
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();
// 每分钟的第 30 秒执行 let job = Job::new() .cron("30 * * * * *") // 秒, 分, 时, 日, 月, 星期 .run(move || { let cnt = counter_clone.fetch_add(1, Ordering::SeqCst); async move { println!("[{}] 任务执行时间:{}", cnt, chrono::Local::now()); // 此处可放置您的业务逻辑 simulate_work().await; } });
println!("带 cron 的调度器已启动。"); job.start().await;
// 演示运行 2 分钟 tokio::time::sleep(Duration::from_secs(120)).await;}
async fn simulate_work() { // 模拟工作 tokio::time::sleep(Duration::from_millis(500)).await;}示例 3:多任务与优先级调度器
使用 async-task-scheduler 库管理多个任务:
use async_task_scheduler::{Scheduler, Task, Priority};use std::time::Duration;
#[tokio::main]async fn main() { let mut scheduler = Scheduler::new();
// 高优先级任务 — 每 2 秒执行一次 scheduler.add_task( Task::new("high_priority_task", || async { println!("[HIGH] 紧急任务已执行"); }) .interval(Duration::from_secs(2)) .priority(Priority::High) );
// 低优先级任务 — 每