010 Rust 異步編程,使用 select 宏的條件

使用select宏

  • select中使用的Future必須實(shí)現(xiàn)Unpin trait和FusedFuture trait。

  • 必須實(shí)現(xiàn)unpin的原因是,select中使用的future不是按值獲取的,而是按照可變引用獲取的,通過不獲取future的所有權(quán),所以在調(diào)用select后,未完成的future可以繼續(xù)使用。

  • 必須實(shí)現(xiàn)FusedFuture的原因,select完成后不會(huì)再輪詢future,因此需要實(shí)現(xiàn)FusedFuture來(lái)跟蹤future是否完成。

  • 同樣的,對(duì)應(yīng)到stream上,會(huì)有一個(gè)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()允許構(gòu)建一個(gè)已經(jīng)終止的空的Future;
  • 當(dāng)需要同時(shí)運(yùn)行同一Future的多個(gè)副本時(shí),可以使用FuturesUnordered類型。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容