13 个版本
0.6.0 | 2024年2月14日 |
---|---|
0.5.2 | 2022年4月27日 |
0.5.1 | 2022年2月16日 |
0.5.0 | 2021年6月6日 |
0.2.1 | 2019年12月19日 |
#675 在 异步
84 每月下载量
在 2 crates 中使用
17KB
197 行
异步延迟队列
一个使用 futures-timer 支持的延迟元素队列,可以与
元素被插入到 DelayQueue
,一旦达到指定的截止日期,就会产生。
可以通过创建时返回的通道消耗延迟项目。
实现
延迟被启动,一个超时与可以触发 DelayHandle
的重置通道进行比赛。如果超时发生在取消或重置之前,则项目将通过接收通道产生。
用法
使用 delay_queue
函数创建一个 DelayQueue
和接收已过期项目的通道。
使用 insert
或 insert_at
方法将元素插入到 DelayQueue
。与项目一起提供截止日期,并返回一个 DelayHandle
。延迟句柄用于删除条目。
延迟可以通过 reset_at
或 reset
方法进行配置,或者通过调用 cancel
方法取消。丢弃句柄不会取消延迟。
如果在此期间延迟项已过期,则修改延迟将失败。在这种情况下,将返回一个 ErrorAlreadyExpired
。如果修改成功,则句柄将返回给调用者。
示例
use futures_delay_queue::delay_queue;
use std::time::Duration;
#[async_std::main]
async fn main() {
let (delay_queue, rx) = delay_queue::<i32>();
let delay_handle = delay_queue.insert(1, Duration::from_millis(20));
assert!(delay_handle.reset(Duration::from_millis(40)).await.is_ok());
let delay_handle = delay_queue.insert(2, Duration::from_millis(10));
assert!(delay_handle.cancel().await.is_ok());
let delay_handle = delay_queue.insert(3, Duration::from_millis(30));
assert_eq!(rx.receive().await, Some(3));
assert_eq!(rx.receive().await, Some(1));
drop(delay_queue);
assert_eq!(rx.receive().await, None);
}
依赖项
~6–16MB
~202K SLoC