Skip to content

Commit 9ec9f9c

Browse files
authored
Merge pull request #35 from BinChengZhao/feature/refactor
Version 0.11.0
2 parents 66080ab + be451b1 commit 9ec9f9c

29 files changed

+948
-611
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
/examples/target/
55
/examples/*.lock
66
.DS_Store
7+
/.vscode
8+
/.vscode/
79

810
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
911
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
@@ -19,4 +21,4 @@ Cargo.lock
1921
*.log
2022
/*.txt
2123
*.dat
22-
.idea
24+
.idea

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
# Version 0.11.0
2+
3+
## Changed
4+
- Optimized the entire delay-timer usage by removing macros for creating asynchronous tasks and now allowing users to use a closure that returns a Future.
5+
6+
- The default internal runtime currently used by 'Tokio', 'smol' can also be manually enabled by the user.
7+
8+
- Updated lots of utility cases, lots of documentation, and dependency updates.
9+
10+
- Fixed a bug where tasks were executed ahead of time.([#33](https://github.com/BinChengZhao/delay-timer/issues/33))
11+
12+
### Details
13+
14+
Major refactoring of 'task execution'.
15+
116
# Version 0.10.1
217

318
## Changed

Cargo.toml

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "delay_timer"
3-
version = "0.10.1"
3+
version = "0.11.0"
44
authors = ["binchengZhao <binchengZhao@outlook.com>"]
55
edition = "2018"
66
repository = "https://github.com/BinChengZhao/delay-timer"
@@ -21,10 +21,8 @@ name = "delay_timer"
2121

2222
[features]
2323
default = []
24-
full = ["tokio-full"]
2524

26-
tokio-full = ["tokio-support","status-report"]
27-
tokio-support = ["tokio"]
25+
full = ["status-report"]
2826
status-report = []
2927

3028

@@ -34,28 +32,33 @@ anyhow = "^1.0.31"
3432
rs-snowflake = "0.5.0"
3533
dashmap = "^4.0.2"
3634
lru = "^0.6.5"
35+
once_cell = "1.9.0"
3736
futures = "^0.3.13"
3837
smol = "^1.2.5"
39-
concat-idents = "1.1.2"
38+
concat-idents = "1.1.3"
4039
async-trait = "^0.1.48"
4140
event-listener = "^2.5.1"
4241
log = "^0.4.14"
42+
tracing = "0.1.29"
4343
thiserror = "^1.0.24"
4444

4545

46-
# Optional
47-
tokio = { version = "^1.3.0", features = ["full"] , optional = true }
46+
tokio = { version = "^1.3.0", features = ["full"] }
4847

4948
[dev-dependencies]
5049
rand = "0.8.4"
5150
surf = "^2.1.0"
52-
tracing = "0.1.29"
51+
tracing-error = { version = "0.1.2" }
5352
tracing-subscriber = "0.2.0"
5453
tokio = { version = "^1.3.0", features = ["full"] }
5554
hyper= {version = "^0.14.2" , features = ["full"] }
5655
pretty_env_logger = "^0.4"
5756
mockall = "^0.8.2"
5857
env_logger = "^0.8.3"
58+
color-eyre = { version = "0.5.11", features = ["capture-spantrace", "issue-url"]}
59+
pretty_assertions = "0.6.1"
60+
thiserror = "1.0.19"
61+
ansi-parser = "0.6.5" # used for testing color schemes
5962

6063
[dev-dependencies.async-std]
6164
version = "^1.9.0"
@@ -80,7 +83,6 @@ features = ["full", "test-util"]
8083
[[example]]
8184
name = "cycle_tokio_task"
8285
path = "examples/cycle_tokio_task.rs"
83-
required-features = ["tokio-support"]
8486

8587
[[example]]
8688
name = "demo"
@@ -96,3 +98,6 @@ required-features = ["full"]
9698
#name = "demo"
9799
#path = "benches/demo.rs"
98100
#required-features = ["full"]
101+
102+
[profile.dev.package.backtrace]
103+
opt-level = 3

README.md

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ delay-timer is a task manager based on a time wheel algorithm, which makes it ea
1414

1515
The underlying runtime is based on the optional smol and tokio, and you can build your application with either one.
1616

17-
The minimum-supported version of `rustc` is **1.49**.
17+
The minimum-supported version of `rustc` is **1.56**.
1818

1919
Except for the simple execution in a few seconds, you can also specify a specific date,
2020
such as Sunday at 4am to execute a backup task.
@@ -61,19 +61,19 @@ fn main() -> Result<()> {
6161
fn build_task_async_print() -> Result<Task, TaskError> {
6262
let mut task_builder = TaskBuilder::default();
6363

64-
let body = create_async_fn_body!({
64+
let body = || async {
6565
println!("create_async_fn_body!");
6666

6767
Timer::after(Duration::from_secs(3)).await;
6868

6969
println!("create_async_fn_body:i'success");
70-
});
70+
};
7171

7272
task_builder
7373
.set_task_id(1)
74-
.set_frequency_repeated_by_seconds(1)
74+
.set_frequency_repeated_by_cron_str("@secondly")
7575
.set_maximum_parallel_runnable_num(2)
76-
.spawn(body)
76+
.spawn_async_routine(body)
7777
}
7878

7979
```
@@ -116,22 +116,21 @@ async fn main() -> Result<()> {
116116
fn build_task_async_print() -> Result<Task, TaskError> {
117117
let mut task_builder = TaskBuilder::default();
118118

119-
let body = create_async_fn_body!({
119+
let body = || async {
120120
println!("create_async_fn_body!");
121121

122122
Timer::after(Duration::from_secs(3)).await;
123123

124124
println!("create_async_fn_body:i'success");
125-
});
125+
};
126126

127127
task_builder
128128
.set_task_id(1)
129-
.set_frequency_repeated_by_seconds(6)
129+
.set_frequency_repeated_by_cron_str("@secondly")
130130
.set_maximum_parallel_runnable_num(2)
131-
.spawn(body)
131+
.spawn_async_routine(body)
132132
}
133133

134-
135134
```
136135

137136

@@ -149,21 +148,19 @@ fn build_task_async_print() -> Result<Task, TaskError> {
149148

150149

151150
let delay_timer = DelayTimer::new();
152-
153151
let share_num = Arc::new(AtomicUsize::new(0));
154152
let share_num_bunshin = share_num.clone();
155-
156-
let body = create_async_fn_body!((share_num_bunshin){
157-
share_num_bunshin_ref.fetch_add(1, Release);
158-
});
159-
153+
154+
let body = move || {
155+
share_num_bunshin.fetch_add(1, Release);
156+
};
157+
160158
let task = TaskBuilder::default()
161-
.set_frequency_count_down_by_seconds(1, 9)
159+
.set_frequency_count_down_by_cron_str(expression, 3)
162160
.set_task_id(1)
163-
.set_maximum_parallel_runnable_num(3)
164-
.spawn(body)?;
161+
.spawn_routine(body)?;
165162

166-
delay_timer.add_task(task);
163+
delay_timer.add_task(task)?;
167164

168165
```
169166

@@ -176,29 +173,28 @@ fn build_task_async_print() -> Result<Task, TaskError> {
176173
use hyper::{Client, Uri};
177174

178175
fn build_task_customized_async_task() -> Result<Task, TaskError> {
176+
let id = 1;
177+
let name = String::from("someting");
179178
let mut task_builder = TaskBuilder::default();
180179

181-
let body = generate_closure_template("delay_timer is easy to use. .".into());
180+
let body = move || {
181+
let name_ref = name.clone();
182+
async move {
183+
async_template(id, name_ref).await.expect("Request failed.");
184+
185+
sleep(Duration::from_secs(3)).await;
186+
187+
println!("create_async_fn_body:i'success");
188+
}
189+
};
190+
182191
task_builder
183192
.set_frequency_repeated_by_cron_str("0,10,15,25,50 0/1 * * Jan-Dec * 2020-2100")
184193
.set_task_id(5)
185194
.set_maximum_running_time(5)
186-
.spawn(body)
195+
.spawn_async_routine(body)
187196
}
188197

189-
pub fn generate_closure_template(
190-
name: String,
191-
) -> impl Fn(TaskContext) -> Box<dyn DelayTaskHandler> + 'static + Send + Sync {
192-
move |context| {
193-
let future_inner = async_template(get_timestamp() as i32, name.clone());
194-
195-
let future = async move {
196-
future_inner.await;
197-
context.finish_task().await;
198-
};
199-
create_delay_task_handler(async_spawn(future))
200-
}
201-
}
202198

203199
pub async fn async_template(id: i32, name: String) -> Result<()> {
204200
let url = format!("https://httpbin.org/get?id={}&name={}", id, name);

benches/body.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fn bench_task_spwan(b: &mut Bencher) {
2323

2424
// String parsing to corn-expression -> iterator is the most time-consuming operation about 1500ns ~ 3500 ns.
2525
// The iterator is used to find out when the next execution should take place, in about 500 ns.
26-
b.iter(|| task_builder.spawn(body.clone()));
26+
b.iter(|| task_builder.spawn_async_routine(body.clone()));
2727
}
2828

2929
#[bench]
@@ -40,12 +40,12 @@ fn bench_maintain_task(b: &mut Bencher) {
4040
.set_maximum_running_time(5)
4141
.set_task_id(1);
4242

43-
// `task_builder.spawn(body)` is about 1500 ns .
43+
// `task_builder.spawn_async_routine(body)` is about 1500 ns .
4444
// So maintain_task takes (result of bench - task_spawn)ns. about 1000ns.
4545
b.iter(|| {
4646
block_on({
4747
async {
48-
if let Ok(task) = task_builder.spawn(body) {
48+
if let Ok(task) = task_builder.spawn_async_routine(body) {
4949
timer.maintain_task(task, 1, 1).await.ok();
5050
}
5151
}
@@ -57,7 +57,7 @@ fn bench_maintain_task(b: &mut Bencher) {
5757
fn bench_try_wait(b: &mut Bencher) {
5858
use std::process::Command;
5959

60-
if let Ok(mut child) = Command::new("ps").spawn() {
60+
if let Ok(mut child) = Command::new("ps").spawn_async_routine() {
6161
b.iter(|| child.try_wait());
6262
}
6363
}

examples/cycle_tokio_task.rs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,45 +30,35 @@ fn main() -> Result<()> {
3030
fn build_task_customized_async_task() -> Result<Task> {
3131
let mut task_builder = TaskBuilder::default();
3232

33-
let body = generate_closure_template("'delay_timer-is-easy-to-use.'".into());
33+
let body = generate_closure_template;
3434

3535
Ok(task_builder
3636
.set_frequency_repeated_by_cron_str("10,15,25,50 0/1 * * Jan-Dec * 2020-2100")
3737
.set_task_id(5)
3838
.set_maximum_running_time(15)
39-
.spawn(body)?)
39+
.spawn_async_routine(body)?)
4040
}
4141

4242
fn build_wake_task() -> Result<Task> {
4343
let mut task_builder = TaskBuilder::default();
4444

4545
let thread: Thread = current();
46-
let body = move |_| {
46+
let body = move || {
4747
println!("bye bye");
4848
thread.unpark();
49-
create_default_delay_task_handler()
5049
};
5150

5251
Ok(task_builder
5352
.set_frequency_by_candy(CandyFrequency::Repeated(AuspiciousDay::Wake))
5453
.set_task_id(7)
5554
.set_maximum_running_time(50)
56-
.spawn(body)?)
55+
.spawn_routine(body)?)
5756
}
5857

59-
pub fn generate_closure_template(
60-
name: String,
61-
) -> impl Fn(TaskContext) -> Box<dyn DelayTaskHandler> + 'static + Send + Sync {
62-
move |context| {
63-
let future_inner = async_template(get_timestamp() as i32, name.clone());
64-
65-
let future = async move {
66-
future_inner.await.ok();
67-
context.finish_task(None).await;
68-
};
69-
70-
create_delay_task_handler(async_spawn_by_tokio(future))
71-
}
58+
pub async fn generate_closure_template() {
59+
let name: String = "'delay_timer-is-easy-to-use.'".into();
60+
let future_inner = async_template(get_timestamp() as i32, name.clone());
61+
future_inner.await.ok();
7262
}
7363

7464
pub async fn async_template(id: i32, name: String) -> Result<()> {

0 commit comments

Comments
 (0)