#延迟 #队列 #async-await #future #async #await

futures-delay-queue

基于 async-std 和 futures-timer 的异步延迟队列

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异步

Download history 5/week @ 2024-04-21 10/week @ 2024-04-28 11/week @ 2024-05-12 1/week @ 2024-05-26 20/week @ 2024-06-02 14/week @ 2024-06-09 7/week @ 2024-06-16 7/week @ 2024-06-23 1/week @ 2024-06-30 6/week @ 2024-07-14 42/week @ 2024-07-21 36/week @ 2024-07-28

84 每月下载量
2 crates 中使用

Apache-2.0/MIT

17KB
197

异步延迟队列

Crates.io docs.rs docs ci

一个使用 futures-timer 支持的延迟元素队列,可以与

  • async-std 作为默认,以及
  • tokio 的 "use-tokio" 功能一起使用

元素被插入到 DelayQueue,一旦达到指定的截止日期,就会产生。

可以通过创建时返回的通道消耗延迟项目。

实现

延迟被启动,一个超时与可以触发 DelayHandle 的重置通道进行比赛。如果超时发生在取消或重置之前,则项目将通过接收通道产生。

用法

使用 delay_queue 函数创建一个 DelayQueue 和接收已过期项目的通道。

使用 insertinsert_at 方法将元素插入到 DelayQueue。与项目一起提供截止日期,并返回一个 DelayHandle。延迟句柄用于删除条目。

延迟可以通过 reset_atreset 方法进行配置,或者通过调用 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