3 个版本 (重大更改)
0.2.0 | 2024年4月11日 |
---|---|
0.1.0 | 2023年7月22日 |
0.0.1 | 2023年7月19日 |
#2 in #轮询
用于 cache_browns
24KB
351 行
interruptible-polling
具有 RAII 驱动的快速清洁退出的通用轮询任务。
请参阅 docs.rs 获取完整详细信息。
许可证
该项目许可为以下之一
任选其一。
该项目的 SPDX 许可证标识符为 MIT OR Apache-2.0
。
lib.rs
:
此库提供了用于安排闭包以作为重复任务执行的 PollingTask
和 SelfUpdatingPollingTask
结构体。
对于服务,通常会有长期运行的轮询操作,其生命周期与进程相同。预期用例是为轮询操作提供一个 RAII 容器,该容器可以中断挂起的睡眠,以便以低延迟干净地退出。
如果轮询操作仍在运行,则任务释放将连接到后台线程,该线程将在闭包完成后退出。
示例
-
使用
PollingTask
每隔 30 秒发送一次心跳。use interruptible_polling::PollingTask; use std::time::Duration; let task = PollingTask::new(Duration::from_secs(30), || { println!("BeatBeat"); });
-
一些轮询操作,如配置更新,包含服务应该继续轮询未来更新的更新速率。`
SelfUpdatingPollingTask
`会将回调传递给轮询任务,使其能够方便地将新状态应用于未来的轮询。use interruptible_polling::SelfUpdatingPollingTask; use std::time::Duration; use serde_json::{Value, from_reader}; use std::fs::File; use std::io::BufReader; let task = SelfUpdatingPollingTask::new(Duration::from_secs(30), move |interval: &mut Duration| { let file = File::open("app.config").unwrap(); let reader = BufReader::new(file); let config: Value = from_reader(reader).expect("JSON was not well-formatted"); // Do other work with config *interval = Duration::from_secs(config["pollingInterval"].as_u64().expect("Polling interval isn't u64 convertable")); } );
-
如果你的轮询操作是长期存在或内部迭代的,有方法检查任务是否仍然活跃,以便允许阻塞的干净退出更快地发生。如果你使用`
PollingTask::new_with_checker
`或`SelfUpdatingPollingTask::new_with_checker
`创建任务,你的闭包将接收到一个查找函数,用于检查管理的任务是否仍然活跃。
use interruptible_polling::PollingTask;
use std::time::Duration;
let task = PollingTask::new_with_checker(
Duration::from_secs(30),
|checker: &dyn Fn() -> bool|
{
let keys = vec![1 ,2, 3];
for key in keys {
// Early exit if signaled. The task will not poll again either way, but you have
// returned control to the parent task earlier.
if !checker() {
break;
}
// Some long or potentially long operation such as a synchronous web request.
}
});
一次触发,不再关注
为了方便,如果你还需要运行不需要干净退出的轮询线程,可以启用“一次触发,不再关注”。这被`fire-forget
`特性所控制,以鼓励使用主要抽象。创建轮询线程并不难,所以典型的crate用户在这里是为了干净的退出结构。然而,一些项目需要两者兼备。如果你需要两者,启用特性以使两者都可用。默认情况下,它是禁用的。