- Notifications
You must be signed in to change notification settings - Fork25
Time-manager of delayed tasks. Like crontab, but synchronous asynchronous tasks are possible scheduling, and dynamic add/cancel/remove is supported.
License
Apache-2.0, MIT licenses found
Licenses found
BinChengZhao/delay-timer
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Time-manager of delayed tasks. Like crontab, but synchronous asynchronous tasks are possible, and dynamic add/cancel/remove is supported.
delay-timer is a task manager based on a time wheel algorithm, which makes it easy to manage timed tasks, or to periodically execute arbitrary tasks such as closures.
The underlying runtime is based on the optional smol and tokio, and you can build your application with either one.
The minimum-supported version ofrustc
is1.56.
Except for the simple execution in a few seconds, you can also specify a specific date,such as Sunday at 4am to execute a backup task.
If you're looking for a distributed task scheduling platform, check out thedelicate
use anyhow::Result;use delay_timer::prelude::*;fnmain() ->Result<()>{// Build an DelayTimer that uses the default configuration of the Smol runtime internally.let delay_timer =DelayTimerBuilder::default().build();// Develop a print job that runs in an asynchronous cycle.// A chain of task instances.let task_instance_chain = delay_timer.insert_task(build_task_async_print()?)?;// Get the running instance of task 1.let task_instance = task_instance_chain.next_with_wait()?;// Cancel running task instances. task_instance.cancel_with_wait()?;// Remove task which id is 1. delay_timer.remove_task(1)?;// No new tasks are accepted; running tasks are not affected. delay_timer.stop_delay_timer()?;Ok(())}fnbuild_task_async_print() ->Result<Task,TaskError>{letmut task_builder =TaskBuilder::default();let body = ||async{println!("create_async_fn_body!");Timer::after(Duration::from_secs(3)).await;println!("create_async_fn_body:i'success");}; task_builder.set_task_id(1).set_frequency_repeated_by_cron_str("@secondly").set_maximum_parallel_runnable_num(2).spawn_async_routine(body)}
Use in asynchronous contexts.
use delay_timer::prelude::*;use anyhow::Result;use smol::Timer;use std::time::Duration;#[tokio::main]asyncfnmain() ->Result<()>{// In addition to the mixed (smol & tokio) runtime// You can also share a tokio runtime with delayTimer, please see api `DelayTimerBuilder::tokio_runtime` for details.// Build an DelayTimer that uses the default configuration of the Smol runtime internally.let delay_timer =DelayTimerBuilder::default().build();// Develop a print job that runs in an asynchronous cycle.let task_instance_chain = delay_timer.insert_task(build_task_async_print()?)?;// Get the running instance of task 1.let task_instance = task_instance_chain.next_with_async_wait().await?;// Cancel running task instances. task_instance.cancel_with_async_wait().await?;// Remove task which id is 1. delay_timer.remove_task(1)?;// No new tasks are accepted; running tasks are not affected. delay_timer.stop_delay_timer()}fnbuild_task_async_print() ->Result<Task,TaskError>{letmut task_builder =TaskBuilder::default();let body = ||async{println!("create_async_fn_body!");Timer::after(Duration::from_secs(3)).await;println!("create_async_fn_body:i'success");}; task_builder.set_task_id(1).set_frequency_repeated_by_cron_str("@secondly").set_maximum_parallel_runnable_num(2).spawn_async_routine(body)}
Capture the specified environment information and build the closure & task:
#[macro_use]use delay_timer::prelude::*;use std::sync::atomic::{AtomicUsize,Ordering::{Acquire,Release},};use std::sync::Arc;let delay_timer =DelayTimer::new();let share_num =Arc::new(AtomicUsize::new(0));let share_num_bunshin = share_num.clone();let body =move ||{ share_num_bunshin.fetch_add(1,Release);};let task =TaskBuilder::default().set_frequency_count_down_by_cron_str(expression,3).set_task_id(1).spawn_routine(body)?;delay_timer.add_task(task)?;
Building customized-dynamic future tasks:
#[macro_use]use delay_timer::prelude::*;use hyper::{Client,Uri};fnbuild_task_customized_async_task() ->Result<Task,TaskError>{let id =1;let name =String::from("someting");letmut task_builder =TaskBuilder::default();let body =move ||{let name_ref = name.clone();asyncmove{async_template(id, name_ref).await.expect("Request failed.");sleep(Duration::from_secs(3)).await;println!("create_async_fn_body:i'success");}}; task_builder.set_frequency_repeated_by_cron_str("0,10,15,25,50 0/1 * * Jan-Dec * 2020-2100").set_task_id(5).set_maximum_running_time(5).spawn_async_routine(body)}pubasyncfnasync_template(id:i32,name:String) ->Result<()>{let url =format!("https://httpbin.org/get?id={}&name={}", id, name);letmut res = surf::get(url).await?;dbg!(res.body_string().await?);Ok(())}
There's a lot more in the [examples] directory.
Licensed under either of
- MIT license (LICENSE-MIT orhttp://opensource.org/licenses/MIT)
- Support tokio Ecology.
- Disable unwrap related methods that will panic.
- Thread and running task quit when delayTimer drop.
- neaten todo in code, replenish tests and benchmark.
- batch-opration.
- report-for-server.
- Future upgrade of delay_timer to multi-wheel mode, different excutor handling different wheels e.g. subtract laps for one wheel, run task for one wheel.
Unless you explicitly state otherwise, any contribution intentionally submittedfor inclusion in the work by you, as defined in the Apache-2.0 license, shall bedual licensed as above, without any additional terms or conditions.
About
Time-manager of delayed tasks. Like crontab, but synchronous asynchronous tasks are possible scheduling, and dynamic add/cancel/remove is supported.
Topics
Resources
License
Apache-2.0, MIT licenses found
Licenses found
Code of conduct
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors5
Uh oh!
There was an error while loading.Please reload this page.