13 个版本 (7 个稳定版)

2.0.0 2022 年 9 月 17 日
1.3.1 2022 年 2 月 2 日
1.3.0 2021 年 8 月 14 日
1.2.1 2021 年 4 月 24 日
0.3.0 2015 年 4 月 13 日

#69Rust 模式

Download history 85497/week @ 2024-03-04 83420/week @ 2024-03-11 67978/week @ 2024-03-18 66729/week @ 2024-03-25 67874/week @ 2024-04-01 70014/week @ 2024-04-08 68648/week @ 2024-04-15 75697/week @ 2024-04-22 73012/week @ 2024-04-29 80328/week @ 2024-05-06 74494/week @ 2024-05-13 73159/week @ 2024-05-20 73150/week @ 2024-05-27 77308/week @ 2024-06-03 70850/week @ 2024-06-10 74692/week @ 2024-06-17

每月下载量 298,078
用于 82 个 crate (56 个直接使用)

MIT 许可协议

25KB
478

retry

Build Status

Crate retry 提供用于重试可能失败的操作的实用工具。

文档

retry 在 docs.rs 上提供了全面的文档。

retry 在 MIT 许可协议下发布。请参阅 LICENSE


lib.rs:

Crate retry 提供用于重试可能失败的操作的实用工具。

用法

使用 retry 函数重试操作。 retry 接受一个 Duration 迭代器和一个返回 Result(或 OperationResult;见下文)的闭包。迭代器用于确定每次未成功尝试后等待多长时间,以及放弃并返回 Result::Err 之前尝试多少次。闭包确定最终成功的值或错误值,该值可以立即返回或用于指示操作应重试。

任何实现了 Iterator 并具有关联 Item 类型为 Duration 的类型都可以用于确定重试行为,尽管在 delay 模块中提供了一些有用的实现,包括固定延迟和指数退避。

let mut collection = vec![1, 2, 3].into_iter();

let result = retry(Fixed::from_millis(100), || {
    match collection.next() {
        Some(n) if n == 3 => Ok("n is 3!"),
        Some(_) => Err("n must be 3!"),
        None => Err("n was never 3!"),
    }
});

assert!(result.is_ok());

可以使用 Iterator API 来限制或修改延迟策略。例如,限制重试次数为 1。

let mut collection = vec![1, 2, 3].into_iter();

let result = retry(Fixed::from_millis(100).take(1), || {
    match collection.next() {
        Some(n) if n == 3 => Ok("n is 3!"),
        Some(_) => Err("n must be 3!"),
        None => Err("n was never 3!"),
    }
});

assert!(result.is_err());

为了处理致命错误,返回 OperationResult,它类似于 Result,但增加了一个第三个情况来区分应该导致重试和应该立即返回的错误,从而停止重试行为。(内部始终使用 OperationResult,将传递给 retry 并返回普通 Result 的闭包转换为 OperationResult。)

use retry::OperationResult;
let mut collection = vec![1, 2].into_iter();
let value = retry(Fixed::from_millis(1), || {
    match collection.next() {
        Some(n) if n == 2 => OperationResult::Ok(n),
        Some(_) => OperationResult::Retry("not 2"),
        None => OperationResult::Err("not found"),
    }
}).unwrap();

assert_eq!(value, 2);

如果你的操作需要知道尝试了多少次,请使用 retry_with_index 函数。这和 retry 一样工作,但会将当前尝试的次数作为参数传递给闭包。

let mut collection = vec![1, 2, 3, 4, 5].into_iter();

let result = retry_with_index(Fixed::from_millis(100), |current_try| {
    if current_try > 3 {
        return OperationResult::Err("did not succeed within 3 tries");
    }

    match collection.next() {
        Some(n) if n == 5 => OperationResult::Ok("n is 5!"),
        Some(_) => OperationResult::Retry("n must be 5!"),
        None => OperationResult::Retry("n was never 5!"),
    }
});

assert!(result.is_err());

功能

  • random:提供一些随机延迟工具(默认启用)

依赖项

~73KB