9个稳定版本
1.3.3 | 2024年8月7日 |
---|---|
1.3.2 | 2023年11月1日 |
1.3.1 | 2023年10月17日 |
#7 在 #interrupt
186 每月下载
用于 rdupes
21KB
323 行
tokio-task-tracker
tokio-task-tracker 是tokio的简单优雅关闭解决方案。
基本思路是使用 TaskSpawner
来创建 TaskTracker
对象,并在已启动的任务中保留它们。在任务内部,你可以检查 tracker.cancelled().await
以等待任务被取消。
可以使用 TaskWaiter
来等待中断,然后等待所有追踪器被丢弃。
示例
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let (spawner, waiter) = tokio_task_tracker::new();
// Start a task
spawner.spawn(|tracker| async move {
tokio::select! {
_ = tracker.cancelled() => {
// The token was cancelled, task should shut down.
}
_ = tokio::time::sleep(Duration::from_secs(9999)) => {
// Long work has completed
}
}
});
// Wait for all tasks to complete, or for someone to hit ctrl-c.
// If tasks down't complete within 5 seconds, we'll quit anyways.
waiter.wait_for_shutdown(Duration::from_secs(5)).await?;
Ok(())
}
如果你不希望允许任务被中止,你仍然需要确保任务捕获追踪器
// Start a task
spawner.spawn(|tracker| async move {
// Move the tracker into the task.
let _tracker = tracker;
// Do some work that we don't want to abort.
tokio::time::sleep(Duration::from_secs(9999)).await;
});
你也可以通过 task
方法创建追踪器
// Start a task
let tracker = spawner.task();
tokio::task::spawn(async move {
// Move the tracker into the task.
let _tracker = tracker;
// ...
});
追踪器可以用于通过 tracker.subtask()
或 tracker.spawn()
创建子任务。
依赖项
~3–12MB
~115K SLoC