#future #link #join #merge #async

linked-futures

将 futures 链接到一个块中,当任何 futures 完成时停止所有包含的 futures

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

MIT 许可证

9KB

linked-futures

Crates.io MIT licensed Build Status

概述

此 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