#graceful-shutdown #tokio-task #async-task #interrupt #wait #solution #tracker

tokio-task-tracker

tokio的简单优雅关闭解决方案

9个稳定版本

1.3.3 2024年8月7日
1.3.2 2023年11月1日
1.3.1 2023年10月17日

#7#interrupt

Download history 1/week @ 2024-05-09 14/week @ 2024-05-16 35/week @ 2024-05-23 34/week @ 2024-05-30 32/week @ 2024-06-06 30/week @ 2024-06-13 21/week @ 2024-06-20 10/week @ 2024-06-27 43/week @ 2024-07-04 8/week @ 2024-07-11 44/week @ 2024-07-18 23/week @ 2024-07-25 71/week @ 2024-08-01 73/week @ 2024-08-08 5/week @ 2024-08-15

186 每月下载
用于 rdupes

MIT 许可证

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