在向量中收集期货,参考生命周期错误

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));
}

您还需要更改签名以接受实际对象,而不是引用