< 返回版块

槟橙炮炮 发表于 2021-02-13 02:33

Tags:async,task,crontab,cron,延迟任务,计划任务,周期异步任务

delay-timer

delay-timer是一个基于时间轮算法构建的lib,它可以很方便地管理定时任务,或者周期性地执行任意任务。

轻松打造一个延迟/周期任务的运行容器。可以想象成crontab,但可以处理同步/异步任务,但支持动态添加/取消/删除,单个任务支持配置任务的最大并行数量,运行时间等。

底层运行时基于的smol和tokio(可选的feature),你可以用其中一个来构建你的应用程序。

v0.3.0 新功能

1.可通过条件编译实现稳定编译。 (最小稳定版本: rustc-stable-1.49.0)

2.平衡性能和用户体验(调整CandyCronStr内的元组类型, 为 TaskBuilder 增加api-free)。

3.支持自定义调度任务的时区(现默认内置的调度时区是CST, 原来为UTC)。

4.修复调度器在smol-runtime中,内部调度节奏过快的问题。

5.使用next_second_hand来解决调度碰撞的问题。

小例子:

创建一个异步的调度任务,支持如下。

id为1, 捕获上下文share_num_bunshin 并每秒钟调度一次, 并行运行的Future数量3个,总计运行9次。


let share_num = Arc::new(AtomicUsize::new(0));
let share_num_bunshin = share_num.clone();


let body = create_async_fn_body!((share_num_bunshin){
    share_num_bunshin_ref.fetch_add(1, Release);
    Timer::after(Duration::from_secs(9)).await;
    share_num_bunshin_ref.fetch_sub(1, Release);
});

let task = TaskBuilder::default()
    .set_frequency_by_candy(CandyFrequency::CountDown(9, CandyCron::Secondly))
    .set_task_id(1)
    .set_maximun_parallel_runable_num(3)
    .spawn(body)
    .unwrap();

在未来的v0.4.0版本中, api-DelayTimer::add_task 可能会有一些调整, 增加返回值 JoinHandle 类似的结构 目的是让用直接操作运行中任务产生的任务实例。

希望针对api的设计与改动,大家能提出宝贵的意见。 谢谢大家:) .

// Here is an expected implementation for DelayTimer::add_task , which is not yet determined.
**Do you have a better opinion?**


 let delay_timer = DelayTimer::default();

 let join_handle = delay_timer.add_task(_).unwrap();

 let peek : Option<Peek<&Instance>> = join_handle.peek().await;
 let peek : Result<Option<Peek<&Instance>>> join_handle.try_peek();

 let instance : Option<Intance> =  join_handle.next().await.unwrap();
 let instance : Result<Option<Intance>> =  join_handle.try_next().unwrap();

 instance.cancel();


repo: delay-timer

repo-raw-url: https://github.com/BinChengZhao/delay-timer

doc: delay-timer-doc

doc-raw-url: https://docs.rs/delay_timer

crates: delay-timer-crates

crates-raw-url: https://crates.io/crates/delay_timer

struct

评论区

写评论

还没有评论

1 共 0 条评论, 1 页