rust - 在异步函数内部调用异步函数会导致生命周期问题
问题描述
该函数run_av_check
接收一个填充了需要使用 reqwest 调用的 URL 的向量。遍历 URL 会给我一个错误,即借来的值的寿命不够长。我的理解是,只要使用循环check_availability
调用的所有 URL没有完成,函数就没有完成,因此变量 URL 在所有调用的运行时应该仍然存在。run_av_check
for
run_av_check
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)
}
}
解决方案
问题是你正在开始独立的任务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()));
推荐阅读
- sql-server - SQL Server 视图不是可移植的吗?
- vba - 如果存在特定值,则对宏 VBA 代码进行一些修改以删除行
- dart - 如何检查 Flutter 应用程序是否在前台?
- c# - 带有数据源的 Asp 日历重复标签
- java - 使用 AWS S3 作为监控平台的中间存储层
- javascript - 使用“opacityDecayVelocity”属性配置纸纹
- kubernetes - 从 kubectl logs -f 的大量日志中拖尾几行
- r - 如何设置y轴的小数位?
- google-chrome-extension - 如何在 Chrome 扩展程序中以编程方式关闭 gmail 撰写对话框
- c# - 根据分隔符符号格式化字符串