4 个版本
0.1.3 | 2019 年 11 月 26 日 |
---|---|
0.1.2 | 2019 年 11 月 24 日 |
0.1.1 | 2019 年 11 月 15 日 |
0.1.0 | 2019 年 11 月 15 日 |
在 异步 类别下排名 760
9KB
linked-futures
概述
此 crate 提供了一种将 futures “链接”到单个块的方法,一旦这些 futures 中的任何一个完成,就会停止执行。
在内部,它使用 FuturesUnordered
来有效地执行多个 futures。为了避免装箱,为每个 link_futures
块生成了一个自定义的 one-of
类型,来自 one-of-futures
crate。
许可证:MIT
用法
将其添加到您的 Cargo.toml
[dependencies]
linked-futures = "0.1"
示例
use std::time::Duration;
use futures::{pin_mut, SinkExt, StreamExt};
use futures::channel::mpsc;
use futures::executor::block_on;
use tokio::time::{delay_for, interval, Instant};
use linked_futures::{link_futures, linked_block};
linked_block!(PeriodicStoppableSender, PeriodicStoppableSenderFutureIdentifier;
Forwarder,
Reader,
Generator,
Stop
);
#[tokio::main]
async fn main() {
let (mut tx1, mut rx1) = mpsc::channel::<Instant>(1);
let (mut tx2, mut rx2) = mpsc::channel::<Instant>(1);
let mut interval = interval(Duration::from_millis(100));
let generator = async {
while let Some(instant) = interval.next().await {
tx1.send(instant).await;
}
};
let forwarder = async {
while let Some(instant) = rx1.next().await {
tx2.send(instant).await;
}
};
let reader = async {
while let Some(instant) = rx2.next().await {
println!("instant: {:?}", instant);
}
};
let stop = async {
delay_for(Duration::from_secs(1)).await;
};
let linked = link_futures!(
PeriodicStoppableSender,
PeriodicStoppableSenderFutureIdentifier;
Generator => generator,
Forwarder => forwarder,
Reader => reader,
Stop => stop
);
block_on(async {
pin_mut!(linked);
let (completed_future_identifier, _) = linked.await;
match completed_future_identifier {
PeriodicStoppableSenderFutureIdentifier::Stop =>
println!("linked block stopped normally"),
n =>
panic!("linked block unexpectedly terminated by future: {:?}", n),
}
});
}
依赖项
~1MB
~16K SLoC