在异步函数内部调用异步函数会导致生命周期问题

时间:2020-09-29 11:33:39

标签: rust rust-tokio

函数run_av_check接收到一个填充有URL的向量,需要使用reqwest进行调用。遍历URL给我一个错误,即借入的值寿命不长。我的理解是,只要使用check_availability循环在run_av_check中调用的所有URL的for都没有完成,run_av_check函数就不会完成,因此变量URL在所有check_availibility调用的运行期间仍应存在。

我已经阅读了Tokio和Rust的文档,但无法找到这种现象发生的方式和原因的线索。为什么会弹出错误,需要进行哪些更改才能使它正常运行,无论是从程序角度还是从我的思维角度而言?

async fn check_availability(host: &str) -> Result<reqwest::StatusCode, reqwest::Error> {
    // ... building url
    match client.get(&url).send().await {
        Ok(r) => Ok(r.status()),
        Err(_e) => Ok(reqwest::StatusCode::GATEWAY_TIMEOUT),
    }
}

async fn run_av_check(urls: Vec<std::string::String>) -> Result<AvResponse, AvError> {
    let mut av_urls: Vec<std::string::String> = vec![];
    let mut s: std::string::String = "".to_string();
    let mut attributes = Vec::new();

    for url in urls.iter() {
        attributes.push(("instance", url));
        let resp = tokio::task::spawn(check_availability(url));
        // ... processing result
        let res = AvResponse {
            av_urls,
            prom_details: s,
        };
        Ok(res)
    }
}

1 个答案:

答案 0 :(得分:-1)

问题是您正在tokio::task::spawn(check_availability(url));

中启动独立任务

此函数使用only 'static references,但是您的url引用本地向量urls

您需要使check_availability接受String类型(fn check_availability(host: String))并像let resp = tokio::task::spawn(check_availability(url.to_string()));一样调用它