#retry #tokio #async #async-await #io-error

retryfn

一个简单的重试函数,支持阻塞或非阻塞,tokio或async-std版本

2个不稳定版本

0.2.0 2021年1月26日
0.1.0 2020年11月24日

1608异步

MIT 许可证

29KB
493

retry_fn

Build Status Crate API

执行重试的函数,可以是基于std的睡眠闭包(thread::sleep)或使用最流行的异步运行时之一。Tokio或async-std。受其他重试库的启发,目标是保持其最新状态并结合多个库的功能。

同步示例

use std::{io, time::Duration};
use retry_fn::{retry, RetryResult, strategy::ExponentialBackoff};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut count = 0;
    let res = retry(ExponentialBackoff::new(Duration::from_secs(2)), |op| {
       if op.retries >= 3 {
           RetryResult::<&str, _>::Err(io::Error::new(
               io::ErrorKind::TimedOut,
               "timed out",
           ))
       } else {
           count += 1;
           RetryResult::Retry()
       }
    });
    assert_eq!(count, 3);
    assert!(res.is_err());
    Ok(())
}

使用tokio

启用tokio-runtime功能以访问此函数

use std::{io, sync::{Arc, Mutex}};
use retry_fn::{tokio::retry, RetryResult, strategy::Constant};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let count: Arc<Mutex<i32>> = Arc::new(Mutex::new(0));
    let res = retry(Constant::from_millis(100), |op| {
        let count = count.clone();
        async move {
            if op.retries >= 3 {
                RetryResult::<&str, _>::Err(io::Error::new(
                    io::ErrorKind::TimedOut,
                    "timed out",
                ))
            } else {
                *count.lock().unwrap() += 1;
                RetryResult::Retry()
            }
        }
    })
    .await;
    assert_eq!(*count.lock().unwrap(), 3);
    assert!(res.is_err());
    Ok(())
}

依赖项

~0–10MB
~106K SLoC