5 个版本 (3 个重大更改)
0.4.1 | 2023 年 8 月 26 日 |
---|---|
0.4.0 | 2023 年 7 月 22 日 |
0.3.0 | 2023 年 7 月 22 日 |
0.2.2 | 2023 年 7 月 1 日 |
0.1.0 | 2023 年 6 月 12 日 |
#8 在 #return
每月下载量 66
30KB
490 行
tokio_tasks_shutdown
轻松管理和优雅关闭 tokio 任务,同时监控其返回结果
示例
use {std::time::Duration, tokio::time::sleep, tokio_tasks_shutdown::*};
// By default this will catch Ctrl+C.
// You may have your tasks return your own error type.
let tasks: TasksMainHandle<anyhow::Error> = TasksBuilder::default()
.timeouts(Some(Duration::from_secs(2)), Some(Duration::from_millis(500)))
.build();
// Spawn tasks
tasks
.spawn("gracefully_shutting_down_task", |tasks_handle| async move {
loop {
match tasks_handle
.on_shutdown_or({
// Simulating another future running concurrently,
// e.g. listening on a channel...
sleep(Duration::from_millis(100))
})
.await
{
ShouldShutdownOr::ShouldShutdown => {
// We have been kindly asked to shutdown, let's exit
break;
}
ShouldShutdownOr::ShouldNotShutdown(res) => {
// Got result of channel listening
}
}
}
Ok(())
// Note that if a task were to error, graceful shutdown would be initiated.
// This behavior can be disabled.
})
.unwrap();
// Note that calls can be chained since `spawn` returns `&TasksHandle`
// Let's simulate a Ctrl+C after some time
let tasks_handle: TasksHandle<_> = tasks.handle();
tokio::task::spawn(async move {
sleep(Duration::from_millis(150)).await;
tasks_handle.start_shutdown();
});
// Let's make sure there were no errors
tasks.join_all().await.unwrap();
// Make sure we have shut down when expected
assert!(
test_duration > Duration::from_millis(145) && test_duration < Duration::from_millis(155)
);
在这个示例中,任务已经在运行一个循环(在 t=100ms 时睡眠)时,在 t=150ms 时请求优雅关闭,这将立即使其优雅地关闭。
类似包
这个包是从 tokio-graceful-shutdown
启发的。我在使用它时遇到了问题,它有时会在任务应该超时时冻结,这非常难以调查,因为代码很多,所以我认为最容易的方法是从头开始重写一个更简单的版本。
与 tokio-graceful-shutdown
相比,它具有 3 倍少的代码,没有子系统概念(任何关闭都是全局的 TasksMainHandle
),更灵活的控制,以及(希望)更可靠的关闭机制(值得注意的是它可以生存任务意外阻塞的情况——尽管我不认为那是我的原始问题)。
依赖关系
~4–15MB
~149K SLoC