Rust轻量级定时器库naive-timer的使用,高性能任务调度与时间管理工具

naive-timer

一个用于嵌入式平台的极简朴素定时器(no_std + alloc)。

示例

let mut timer = naive_timer::Timer::default();
let event = Arc::new(AtomicBool::new(false));

// 添加一个带回调的定时器
timer.add(Duration::from_secs(1), {
    let event = event.clone();
    move |_now| event.store(true, Ordering::SeqCst)
});

// 使定时器过期(通常来自定时器中断)
timer.expire(Duration::from_millis(1000));
assert_eq!(event.load(Ordering::SeqCst), true);
assert_eq!(timer.next(), None);

完整示例代码

use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
use std::time::Duration;
use naive_timer::Timer;

fn main() {
    // 创建定时器实例
    let mut timer = Timer::default();
    
    // 创建一个原子布尔事件用于回调
    let event = Arc::new(AtomicBool::new(false));

    // 添加定时器:1秒后触发回调
    timer.add(Duration::from_secs(1), {
        let event = event.clone();
        move |_now| {
            // 回调函数:设置事件为true
            event.store(true, Ordering::SeqCst);
            println!("定时器触发!");
        }
    });

    // 模拟时间流逝:经过1000毫秒(1秒)
    timer.expire(Duration::from_millis(1000));
    
    // 验证事件已被触发
    assert_eq!(event.load(Ordering::SeqCst), true);
    
    // 验证定时器队列已清空
    assert_eq!(timer.next(), None);
    
    println!("定时器测试成功!");
}

许可证

本仓库中的代码根据MIT许可证授权。


1 回复

Rust轻量级定时器库naive-timer使用指南

概述

naive-timer是一个轻量级、高性能的Rust定时器库,专注于任务调度和时间管理。它提供了简洁的API和高效的时间轮算法实现,适合需要精确时间控制的应用程序。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
naive-timer = "0.3"

基本用法

1. 创建定时器实例

use naive_timer::Timer;

let timer = Timer::new();

2. 添加一次性定时任务

use std::time::Duration;

// 5秒后执行的任务
let task_id = timer.add_task(
    Duration::from_secs(5),
    Box::new(|| {
        println!("任务执行了!");
    })
);

3. 添加周期性任务

// 每2秒执行一次的任务
let periodic_id = timer.add_periodic_task(
    Duration::from_secs(2),
    Box::new(|| {
        println!("周期性任务执行");
    })
);

4. 取消任务

timer.cancel_task(task_id);

5. 高级示例:带参数的任务

use std::sync::Arc;

let shared_data = Arc::new("共享数据".to_string());

let callback_id = timer.add_task(
    Duration::from_secs(3),
    Box::new(move || {
        let data = shared_data.clone();
        println!("接收到数据: {}", data);
    })
);

性能特性

  • 基于时间轮算法,O(1)时间复杂度
  • 低内存占用
  • 高精度定时(毫秒级)
  • 线程安全设计

完整示例

use naive_timer::Timer;
use std::time::Duration;
use std::thread;

fn main() {
    let timer = Timer::new();
    
    // 添加多个定时任务
    timer.add_task(
        Duration::from_secs(1),
        Box::new(|| println!("1秒后执行"))
    );
    
    timer.add_task(
        Duration::from_secs(3),
        Box::new(|| println!("3秒后执行"))
    );
    
    // 保持主线程运行
    thread::sleep(Duration::from_secs(5));
}

注意事项

  1. 定时器需要在单独的线程中运行或集成到事件循环中
  2. 任务执行是同步的,长时间任务可能影响定时精度
  3. 适合I/O密集型任务,计算密集型任务建议使用线程池

这个库为Rust开发者提供了简单而强大的定时任务管理能力,特别适合网络编程、游戏开发和实时系统等场景。

完整示例demo

use naive_timer::Timer;
use std::time::Duration;
use std::thread;
use std::sync::Arc;

fn main() {
    // 创建定时器实例
    let timer = Timer::new();
    
    // 一次性任务示例:3秒后执行
    let one_time_id = timer.add_task(
        Duration::from_secs(3),
        Box::new(|| {
            println!("一次性任务:3秒时间到!");
        })
    );
    
    // 周期性任务示例:每2秒执行一次
    let periodic_id = timer.add_periodic_task(
        Duration::from_secs(2),
        Box::new(|| {
            println!("周期性任务:每2秒执行一次");
        })
    );
    
    // 带参数的共享数据任务
    let shared_counter = Arc::new(0);
    let counter_clone = shared_counter.clone();
    
    let param_task_id = timer.add_task(
        Duration::from_secs(5),
        Box::new(move || {
            println!("带参数任务执行,计数器值: {}", *counter_clone);
        })
    );
    
    // 演示取消任务(这里取消一次性任务)
    // timer.cancel_task(one_time_id);
    
    println!("定时任务已设置,等待执行...");
    
    // 保持主线程运行足够长时间以观察所有任务执行
    thread::sleep(Duration::from_secs(10));
    
    // 取消周期性任务
    timer.cancel_task(periodic_id);
    println!("程序结束");
}
回到顶部