首页 > 解决方案 > 暂时挂起或停用 futures::select 中使用的间隔流

问题描述

我目前正在编写一个很大程度上基于以明确定义的频率重复任务的应用程序。因此,我选择像这样设置我的主循环:

use async_std::stram::interval;
use futures::{pin_mut, select, stream::StreamExt};

let interval_a = interval(duration_a).fuse();
let interval_b = interval(duration_b).fuse();
pin_mut!(interval_a, interval_b);

loop {
  select! {
    _ = interval_a.next() => {
      // perform task A
    }
    _ = interval_b.next() => {
      // perform task B
    }
    complete => break,
    default => std::thread::sleep(some_time), // though due to the async select! this may not yield much benefit
  }
}

现在的问题是我有一个需要以高频率执行的任务(比如说任务 B),但前提是满足某个条件(这是在另一个间隔中确定的,例如任务 A)。

一种直接的方法当然是if在任务 B 中简单地包含一个条件,continue;但我想知道是否有更优雅的挂起方式来interval_b代替,这样除非它相关,否则它不会被select!编辑。

我的第一个冲动是用 初始化相应的流let mut interval_b = futures::stream::pending().fuse(),然后如果满足任务 A 中的相关条件,我将分配适当的,或者如果一段时间后不再满足条件,则将其interval_b = interval(duration_b)重置为 a 。Pending但是,这会导致打字问题,因为 aFuse<Pending<Interval>>不是 a Fuse<Interval>,所以不能突然将后者的值分配给前者的变量。

我想知道是否dyn可以使用基于 - 的类型声明,即

let mut interval_b: 
  Box<dyn mut futures::stream::FusedStream<Item = async_std::stream::Interval>>>
  = Box::new(futures::stream::pending().fuse())`

然而,虽然我可以interval_b这样声明,但我无法弄清楚如何为其分配一个装箱的融合间隔,并且在固定装箱值时遇到问题select!

所以我一直在想,我想在 Rust 中实现什至可能实现的目标,如果是这样,我目前的方法有什么问题。

标签: asynchronousruststream

解决方案


推荐阅读