Crate taskwait[−][src]
This library provides facility to wait on multiple spawned async tasks. It is runtime agnostic.
Adding and waiting on tasks
use taskwait::TaskGroup; #[tokio::main] async fn main() { let tg = TaskGroup::new(); for _ in 0..10 { tg.add(); let tg_c = tg.clone(); tokio::spawn(async move{ //... tg_c.done(); }); } tg.wait().await; }
Note: User must ensure that call to done() made above is made in both success & error code path.
Using add_work
This example uses add_work() which creates a Work
object. When it goes out of scope done() is
is automatically called.
use taskwait::TaskGroup; #[tokio::main] async fn main() { let tg = TaskGroup::new(); for _ in 0..10 { let work = tg.add_work(1); tokio::spawn(async move{ let _work = work; // done() will be called when this is dropped //... }); } tg.wait().await; }
Reusing the taskgroup
The following shows how the same task group can be reused to achieve checkpointing
use taskwait::{TaskGroup, Work}; async fn multiple_tasks(tg: TaskGroup, count: usize) { for _ in 0..count { let work = tg.add_work(1); tokio::spawn(async move { let _work = work; // .. do something }); } } #[tokio::main] async fn main() { let tg = TaskGroup::new(); // Spawn 100 tasks tokio::spawn(multiple_tasks(tg.clone(), 100)); // Let the first 100 complete first. tg.wait().await; // Spawn 2nd batch tokio::spawn(multiple_tasks(tg.clone(), 100)); // Now wait for 2nd batch tg.wait().await; // Wait for the next 100 }
Structs
TaskGroup | Group of tasks to be waited on. |
WaitFuture | Future to wait for the counter to become 0 or -ve. |
Work | Represents a work or task. |