asynchronous - 暂时挂起或停用 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 中实现什至可能实现的目标,如果是这样,我目前的方法有什么问题。
解决方案
推荐阅读
- flutter - Flutter firebase admob ad failed
- c# - OpenXML adding images to a Word document randomly corrupts the file
- python - 从 github 用户(公共和私有)检索所有存储库的列表
- javascript - Bot composer - Hero Card - Button to new dialog
- javascript - How to open the concrete article in Zendesk Widget?
- angular - Cannot assign to read only property '0' of object '[object Array] primeng
- flutter - 我想要一个在关闭后自行打开的 AlertDialog
- google-cloud-platform - 如何解决 terraform 错误“等待状态变为‘完成:真’时超时(最后状态:‘完成:假’,超时:10m0s)”?
- python - How to filter keypoint matches in OpenCV?
- jmeter - 如何从以下针对 jmeter 中的验证链接收到的 json 响应中提取 Id 和令牌