[英]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.