簡體   English   中英

有沒有辦法在沒有 Box 的情況下對 Rust 進行遞歸異步調用?

[英]Is there a way to do recursive async calls on Rust without Box?

在參數中嵌入重試計數的遞歸調用對項目的心理 model 有好處,因為您不必一直考慮 ZA8CFDE6331BD59EB2AC96F8911C4B6666Z 的 state。 retry_count在每次調用中傳遞。 這是一個簡單的實現:

use std::future::Future;
use futures::future::{BoxFuture, FutureExt};

fn do_or_fail() -> std::result::Result<(),()> {
    Ok(())
}

fn do_something<'a>(
        retry_count: u32
) -> BoxFuture<'a, std::result::Result<(), ()>> {
    async move {
        match do_or_fail() {
            Ok(_) => Ok(()),
            Err(_) => do_something(retry_count -1).await
        }
    }.boxed()
}

fn main() {
    do_something(3);
}

操場

問題是這需要在每次調用時進行動態分配,以便它可以返回BoxFuture 這是因為在 Rust 中如何實現異步。 它為每個 await 調用生成一個 state 機器,因此返回類型不是 Sized。

在遞歸異步調用中克服動態分配的好方法是什么?

雖然它在技術上並沒有解決問題(它只是隱藏它),但我可以推薦 crate async_recursion

https://crates.io/crates/async-recursion

use async_recursion::async_recursion;
use tokio;

fn do_or_fail() -> std::result::Result<(), ()> {
    Ok(())
}

#[async_recursion]
async fn do_something(retry_count: u32) -> std::result::Result<(), ()> {
    match do_or_fail() {
        Ok(_) => Ok(()),
        Err(_) => do_something(retry_count - 1).await,
    }
}

#[tokio::main]
async fn main() {
    do_something(3).await.unwrap()
}

我認為您實際上無法克服異步調用中的動態分配,這就是異步通常的工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM