You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否仅借助futures crate实现Rust异步休眠?

无额外依赖实现Rust低精度异步休眠

你的思路是对的——利用oneshot通道结合线程睡眠,确实能在不新增依赖的前提下实现异步休眠。不过可以优化几个细节,让代码更实用:

  • 去掉#[cfg(debug_assertions)]:原代码只在debug模式下生效,release模式会丢失这个函数,不符合实际使用需求
  • 简化错误处理:oneshot发送失败通常是因为接收方已被丢弃,这种场景下不需要额外处理,直接忽略即可;接收错误同理,无需返回Result增加使用成本
  • 代码精简:去掉不必要的错误映射,让逻辑更清晰

优化后的代码如下:

use futures::channel::oneshot;
use std::thread;
use std::time::Duration;

pub async fn async_delay(duration: Duration) {
    let (tx, rx) = oneshot::channel();

    thread::spawn(move || {
        thread::sleep(duration);
        // 接收方已丢弃时发送失败,无需处理
        let _ = tx.send(());
    });

    // 忽略接收过程中的错误(如发送线程panic、接收方提前drop)
    let _ = rx.await;
}

#[cfg(test)]
mod tests {
    use super::*;
    use futures::executor::block_on;

    #[test]
    fn test_async_delay() {
        println!("测试启动");
        block_on(async {
            loop {
                println!("开始1秒延迟");
                async_delay(Duration::from_secs(1)).await;
                println!("延迟完成");
            }
        });
    }
}

这个实现完全基于你已依赖的futures crate和标准库,没有新增任何外部依赖。精度上受操作系统线程调度影响,对于1秒级的低精度需求完全够用。

如果后续你切换到Tokio、Async-std这类异步运行时,它们都提供了原生的异步休眠API,但在当前最小化依赖的需求下,这个方案是最适合的。

内容的提问来源于stack exchange,提问作者Poperton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:31:13