< 返回版块

jm-observer 发表于 2022-05-30 23:02

Tags:timer

timer-util是一个极其简单的定时器辅助工具,专门用于生成定时所需的秒数。在我看来有几个优点,请各位关注指正:

  1. 采用了位运算用来存储定时器的配置(如时,分,秒配置)
  2. 极致的抽象,只用一个特征来实现各个维度(每月/周的天数、小时、分、秒)的操作
  3. 采用了build模式,加上简单的api,极容易上手
  4. 采用enum来规避数值的校验(如秒不应大于60等),减少返回Result

crate,一个简单的案例:

use log::LevelFilter;
use std::time::Duration;
use timer_util::*;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    custom_utils::logger::logger_default("timers", LevelFilter::Trace).unwrap();

    // 定时器配置(timer configs):
    // every weekday or 1st..10st 15st..25st every month    每周六 或者每月的1号到9号、15号到24号
    // every hour   每小时
    // 0st/10st/20st/30st/40st/50st minuter 第0/10/20/30/40/50分钟
    // 0st/30st second  第0/30秒
    let conf = DayHourMinuterSecondConf::default_week_days(WeekDays::default_value(W6))
        .conf_month_days(MonthDays::default_range(D1..D10)?.add_range(D15..D25)?)
        .build_with_hours(Hours::default_all())
        .build_with_minuter(Minuters::default_array(&[M0, M10, M20, M30, M40, M50]))
        .build_with_second(Seconds::default_array(&[S0, S30]));

    // let next_seconds = conf.next()?;

    let handle = tokio::spawn(async move {
        loop {
            let off_seconds = conf.next().unwrap();
            println!("next seconds: {}", off_seconds);
            tokio::time::sleep(Duration::from_secs(off_seconds)).await;
            // println!("{:?}", OffsetDateTime::now_local().unwrap());
        }
    });
    handle.await.unwrap();
    Ok(())
}

评论区

写评论
作者 jm-observer 2022-06-02 09:48

比如小时就应该是0点到23点之间,秒就应该是0到59秒之间。

作者 jm-observer 2022-06-02 09:46

抱歉,早上才看到。

  1. 这个定时器设定大体是这样的,比如:每周1、每周3;每天的早上9点;第30分钟;第10秒。

这样,每周1的早上9点30分10秒会触发、每周3的早上9点30分10秒会触发。

所以里面关于维度的设定都是特定范围,比如小时就应该是0点23点,秒就应该是059秒。

这个定时器并不是那种每多长时间执行的定时器。

  1. AsData这个trait是为了限制。你看下面代码,为了就是规避crate外其他可以转成u64(比如)的类型,保证参数只能是这个crate的类型,这样就可以保证参数不会超出范围(比如秒传入了100)。这样可以省去大量的校验,也可以不用返回result
    fn default_value(val: impl AsData<Self::ValTy>) -> Self {

--
👇
snylonue: > 如秒不应大于60等

为什么?如果想要 310s 还要写 5min + 10s 吗

以及 AsData 这个 trait 看起来和 Into 没什么区别

snylonue 2022-06-01 14:31

如秒不应大于60等

为什么?如果想要 310s 还要写 5min + 10s 吗

以及 AsData 这个 trait 看起来和 Into 没什么区别

1 共 3 条评论, 1 页