2个不稳定版本
0.2.0 | 2021年1月26日 |
---|---|
0.1.0 | 2020年11月24日 |
1608 在 异步
29KB
493 行
retry_fn
执行重试的函数,可以是基于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