jitterbug/examples/demo.rs

86 lines
1.9 KiB
Rust
Raw Normal View History

use std::sync::Arc;
use std::task::{Wake, Waker};
2022-01-30 02:26:35 +00:00
use safe_executor::Executor;
2022-01-29 21:50:49 +00:00
2022-02-11 04:25:38 +00:00
fn spawn(executor: &Executor) {
println!("Spawning futures");
2022-01-29 21:50:49 +00:00
2022-02-11 04:25:38 +00:00
let task1 = executor.spawn(async move {
println!("Henlo from first spawn");
2022-01-29 21:50:49 +00:00
"A"
});
2022-02-11 04:25:38 +00:00
let task2 = executor.spawn(async move {
println!("Henlo from second spawn");
2022-01-29 21:50:49 +00:00
"B"
});
2022-02-11 04:25:38 +00:00
let run2m = executor.clone();
2022-01-29 21:50:49 +00:00
2022-02-11 04:25:38 +00:00
executor.spawn(async move {
2022-01-29 21:50:49 +00:00
let res1 = task1.await;
let res2 = task2.await;
println!("Henlo from third spawn, {:?}, {:?}", res1, res2);
2022-01-29 21:50:49 +00:00
let res3 = run2m
.spawn(async move {
println!("Henlo from inner spawn");
2022-01-29 21:50:49 +00:00
"D"
})
.await;
println!("Henlo again from third spawn, {:?}", res3);
2022-01-29 21:50:49 +00:00
});
}
struct DummyWaker;
impl Wake for DummyWaker {
fn wake(self: std::sync::Arc<Self>) {}
fn wake_by_ref(self: &Arc<Self>) {}
}
fn main() {
2022-02-11 04:25:38 +00:00
let executor = Executor::new();
let runner = executor.clone().into_runner();
// This creates 3 new tasks
2022-02-11 04:25:38 +00:00
spawn(&executor);
let waker: Waker = Arc::new(DummyWaker).into();
2022-02-11 04:25:38 +00:00
while runner.any_woken() {
println!("Ticking");
2022-02-11 04:25:38 +00:00
runner.tick(&waker);
}
// This reclaims the first 3 tasks
println!("Pruning");
2022-02-11 04:25:38 +00:00
runner.prune();
2022-01-29 21:50:49 +00:00
// This creates 3 new tasks
2022-02-11 04:25:38 +00:00
spawn(&executor);
while runner.any_woken() {
2022-01-29 21:50:49 +00:00
println!("Ticking");
2022-02-11 04:25:38 +00:00
runner.tick(&waker);
2022-01-29 21:50:49 +00:00
}
// This re-uses the 3 tasks created prior
2022-02-11 04:25:38 +00:00
spawn(&executor);
// This doesn't reclaim any tasks, since we've spawned 3 more futures
println!("Pruning");
2022-02-11 04:25:38 +00:00
runner.prune();
2022-02-11 04:25:38 +00:00
while runner.any_woken() {
println!("Ticking");
2022-02-11 04:25:38 +00:00
runner.tick(&waker);
// This reclaims tasks as their futures resolve on each tick
println!("Pruning");
2022-02-11 04:25:38 +00:00
runner.prune();
}
println!("Hewwo Mr Obama");
2022-01-29 21:50:49 +00:00
}