首页 > 解决方案 > 有没有办法在锈异步中同时轮询几个期货

问题描述

我正在尝试由迭代器并行执行几个 sqlx 查询。这可能是我迄今为止最接近的。

let mut futures = HahshMap::new() // placeholder, filled HashMap in reality
    .iter()
    .map(async move |(_, item)| -> Result<(), sqlx::Error> {
        let result = sqlx::query_file_as!(
            // omitted
        )
            .fetch_one(&pool)
            .await?;
        channel.send(Enum::Event(result)).ignore();
        Ok(())
    })
    .clollect();
futures::future::join_all(futures);

所有查询和发送都是相互独立的,因此如果其中一个失败,其他的仍应得到处理。此外,当前的异步关闭是不可能的。

标签: asynchronousrustparallel-processing

解决方案


Rust 还没有async闭包。相反,您需要让闭包返回一个异步块:

move |(_, item)| async move { ... }

此外,请确保您.await返回的 future 是join_all为了确保实际轮询各个任务。


推荐阅读