#轮询 #任务 #轮询 #后台线程

interruptible_polling

具有 RAII 驱动的快速清洁退出的通用轮询任务

3 个版本 (重大更改)

0.2.0 2024年4月11日
0.1.0 2023年7月22日
0.0.1 2023年7月19日

#2 in #轮询


用于 cache_browns

MIT/Apache

24KB
351

interruptible-polling

具有 RAII 驱动的快速清洁退出的通用轮询任务。

请参阅 docs.rs 获取完整详细信息。

许可证

该项目许可为以下之一

任选其一。

该项目的 SPDX 许可证标识符为 MIT OR Apache-2.0


lib.rs:

githubcrates-iodocs-rs


此库提供了用于安排闭包以作为重复任务执行的 PollingTaskSelfUpdatingPollingTask 结构体。

对于服务,通常会有长期运行的轮询操作,其生命周期与进程相同。预期用例是为轮询操作提供一个 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用户在这里是为了干净的退出结构。然而,一些项目需要两者兼备。如果你需要两者,启用特性以使两者都可用。默认情况下,它是禁用的。

没有运行时依赖