010 Rust 非同步程式設計,使用 select 巨集的條件

linghuyichong發表於2020-07-01
  • select中使用的Future必須實現Unpin trait和FusedFuture trait。

  • 必須實現unpin的原因是,select中使用的future不是按值獲取的,而是按照可變引用獲取的,通過不獲取future的所有權,所以在呼叫select後,未完成的future可以繼續使用。

  • 必須實現FusedFuture的原因,select完成後不會再輪詢future,因此需要實現FusedFuture來跟蹤future是否完成。

  • 同樣的,對應到stream上,會有一個FusedStream trait。

使用流的示例:

use futures::{
    stream::{Stream, StreamExt, FusedStream},
    select,
};

async fn add_two_streams(
    mut s1: impl Stream<Item = u8> + FusedStream + Unpin,
    mut s2: impl Stream<Item = u8> + FusedStream + Unpin,
) -> u8 {
    let mut total = 0;

    loop {
        let item = select! {
            x = s1.next() => x,
            x = s2.next() => x,
            complete => break,
        };
        if let Some(next_num) = item {
            total += next_num;
        }
    }

    total
}

其它

  • Fuse::terminated()允許構建一個已經終止的空的Future;
  • 當需要同時執行同一Future的多個副本時,可以使用FuturesUnordered型別。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

令狐一衝

相關文章