在向量中收集期货,参考生命周期错误
Collecting futures in vector, reference lifetime error
我正在尝试使用包含参数的向量执行异步函数,然后将未来收集到另一个向量中以便稍后加入。
由于将 ldap 参数作为可变引用传递,我遇到了编译器错误 ldap was mutably borrowed here in the previous iteration of the looprustc(E0499)
。使用 await()
.
同步调用函数时,我没有收到此错误
如何修复 run_query() 中 ldap 参数的生命周期?
此外,如果有人有更惯用的方法来执行带有参数向量的异步函数,请告诉我,感谢任何帮助!
代码:
use ldap3::{Ldap, LdapConnAsync, Scope, SearchEntry, result::Result};
#[derive(Serialize, Deserialize, Debug)]
struct Query{
name: String,
base_dn: String,
query: String,
attr: Vec<String>,
}
async fn run_query(ldap: &mut Ldap, query: Query) -> Result<String>{
// run query
let (rs, _res) = ldap.search(
&query.base_dn,
Scope::Subtree,
&query.query,
&query.attr
).await?.success()?;
// output results
let output = resultentries_to_string(rs).unwrap();
return Ok(output);
}
#[tokio::main]
async fn main() -> Result<()> {
let query = ...Vector of Query struct...
let (conn, mut ldap) = LdapConnAsync::new("ldap://localhost:389").await?;
let mut futures:Vec<_> = Vec::new();
for query in queries{
futures.push(run_query(&mut ldap, query));
}
join_all(futures);
}
完整错误:
error[E0499]: cannot borrow `ldap` as mutable more than once at a time
--> src/main.rs:174:32
|
174 | futures.push(run_query(&mut ldap, query));
| ^^^^^^^^^ `ldap` was mutably borrowed here in the previous iteration of the loop
您得到错误的原因是您多次借用 ldap 的 for 循环。在同步情况下,它可以工作,因为您等待每次迭代结束(不会同时多次可变借用 ldap,os 不是异步情况)。
为了克服这个问题,如果不是太贵,你可以在每次使用查询时克隆 ldap:
for query in queries{
let mut ldap_clone = ldap.clone()
futures.push(run_query(&mut ldap_clone, query));
}
您还需要更改签名以接受实际对象,而不是引用
我正在尝试使用包含参数的向量执行异步函数,然后将未来收集到另一个向量中以便稍后加入。
由于将 ldap 参数作为可变引用传递,我遇到了编译器错误 ldap was mutably borrowed here in the previous iteration of the looprustc(E0499)
。使用 await()
.
如何修复 run_query() 中 ldap 参数的生命周期?
此外,如果有人有更惯用的方法来执行带有参数向量的异步函数,请告诉我,感谢任何帮助!
代码:
use ldap3::{Ldap, LdapConnAsync, Scope, SearchEntry, result::Result};
#[derive(Serialize, Deserialize, Debug)]
struct Query{
name: String,
base_dn: String,
query: String,
attr: Vec<String>,
}
async fn run_query(ldap: &mut Ldap, query: Query) -> Result<String>{
// run query
let (rs, _res) = ldap.search(
&query.base_dn,
Scope::Subtree,
&query.query,
&query.attr
).await?.success()?;
// output results
let output = resultentries_to_string(rs).unwrap();
return Ok(output);
}
#[tokio::main]
async fn main() -> Result<()> {
let query = ...Vector of Query struct...
let (conn, mut ldap) = LdapConnAsync::new("ldap://localhost:389").await?;
let mut futures:Vec<_> = Vec::new();
for query in queries{
futures.push(run_query(&mut ldap, query));
}
join_all(futures);
}
完整错误:
error[E0499]: cannot borrow `ldap` as mutable more than once at a time
--> src/main.rs:174:32
|
174 | futures.push(run_query(&mut ldap, query));
| ^^^^^^^^^ `ldap` was mutably borrowed here in the previous iteration of the loop
您得到错误的原因是您多次借用 ldap 的 for 循环。在同步情况下,它可以工作,因为您等待每次迭代结束(不会同时多次可变借用 ldap,os 不是异步情况)。
为了克服这个问题,如果不是太贵,你可以在每次使用查询时克隆 ldap:
for query in queries{
let mut ldap_clone = ldap.clone()
futures.push(run_query(&mut ldap_clone, query));
}
您还需要更改签名以接受实际对象,而不是引用