rust 时雄无法使用方法参数安全地生成future

ahy6op9u  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(125)

在这个函数中,我想向一个JoinSet添加一个查询,令人费解的是,编译器抱怨scylla的生命周期不够长。

pub async fn foobar(scylla: Data<scylla::Session>) {
    let mut queries = tokio::task::JoinSet::new();
    let task = scylla.query("hello", &[]);
    queries.spawn(task);
    queries.join_next().await;
}
`scylla` does not live long enough
borrowed value does not live long enough (rustc) Click for full compiler diagnostic
post.rs(46, 1): `scylla` dropped here while still borrowed

这个错误发生在scylla.query调用上,它说scylla被放到了函数的末尾,如果我直接运行await而不尝试joinset,它不会抱怨,但是我希望许多查询彼此并行运行。
我试过克隆“锡拉”,但没有成功。我也试过打乱“生存期”的括号。它只是不想把它的未来移到一个连接集里。
JoinSets也不是问题,我也不能简单地对这个变量使用tokio::spawn(),问题似乎是这个值用在异步函数中,所以编译器不确定这些函数是否会在父方法完成之前完成,即使代码的逻辑意味着它会完成。

enyaitl3

enyaitl31#

为了说服编译器,将scylla移到未来(顺便说一句,编译器是对的,它们可能不会完成):

pub async fn foobar(scylla: Data<scylla::Session>) {
    let mut queries = tokio::task::JoinSet::new();
    queries.spawn(async move {
        scylla.query("hello", &[]).await;
    });
    queries.join_next().await;
}

相关问题