首页 > 解决方案 > 在异步函数内部调用异步函数会导致生命周期问题

问题描述

该函数run_av_check接收一个填充了需要使用 reqwest 调用的 URL 的向量。遍历 URL 会给我一个错误,即借来的值的寿命不够长。我的理解是,只要使用循环check_availability调用的所有 URL没有完成,函数就没有完成,因此变量 URL 在所有调用的运行时应该仍然存在。run_av_checkforrun_av_checkcheck_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)
    }
}

标签: rustrust-tokio

解决方案


问题是你正在开始独立的任务tokio::task::spawn(check_availability(url));

此函数仅接受'static引用,但您url引用的是本地向量urls

您需要check_availability接受String类型 ( fn check_availability(host: String)) 并将其称为let resp = tokio::task::spawn(check_availability(url.to_string()));


推荐阅读