Linux 添加对mongodb的异步调用后,actix web with mongodb项目无法生成

Linux 添加对mongodb的异步调用后,actix web with mongodb项目无法生成,linux,mongodb,rust,actix-web,Linux,Mongodb,Rust,Actix Web,我正在为数据后端使用actix web和mongodb实现REST API。我使用的是crates.io和rust 1.46中官方rust mongodb驱动程序的1.1.1版 例如,如果我添加代码来调用mongodb集合以获取记录,即使货物检查没有显示错误或警告,货物构建花费了很长时间,然后以无法编译我的项目的错误和终止(信号9,SIGKILL:kill)。查找问题后,我发现这可能是在构建/链接过程中导致的内存不足错误。我在一台Debian10机器上工作,内存为16GB,所以这不是很合理 le

我正在为数据后端使用actix web和mongodb实现REST API。我使用的是crates.io和rust 1.46中官方rust mongodb驱动程序的1.1.1版

例如,如果我添加代码来调用mongodb集合以获取记录,即使
货物检查
没有显示错误或警告,
货物构建
花费了很长时间,然后以无法编译我的项目的错误和
终止(信号9,SIGKILL:kill)
。查找问题后,我发现这可能是在构建/链接过程中导致的内存不足错误。我在一台Debian10机器上工作,内存为16GB,所以这不是很合理

let client = mongodb::Client::with_uri_str(client_uri.as_ref()).await;
println!("Databases:");
for name in client.unwrap().list_database_names(None, None).await {
    for item in name {
        println!("- {}", item);
    }
}
只有在使用
async
wait
在“处理程序”中调用代码时,才会发生这种情况

例如,如果我尝试获取样本集合的名称,如下所示:

pub async fn samples() -> Result<HttpResponse, Error> {
    let dbnames = get_samples().await;

    Ok(HttpResponse::Ok().json(dbnames.unwrap()))
}

async fn get_samples() -> Result<Vec<String>, ServiceError> {
    let mut dbnames: Vec<String> = Vec::new();
    let client_uri = String::from("mongodb+srv://<...MONGODB_CONNECTION_INFO...>/sample_mflix?retryWrites=true&w=majority");
    let client = mongodb::Client::with_uri_str(client_uri.as_ref()).await?;

    for name in client.list_database_names(None, None).await? {
        dbnames.push(format!("- {}", name));
    }

    Ok(dbnames)
}
即使使用
cargo build--release
来避免调试信息过多,结果也是一样的

这仅在使用rust mongodb驱动程序的异步API时发生。使用syncapi,一切都可以正常构建和工作


这可能是什么原因造成的?

在使用异步API升级到1.1.1之后,我遇到了完全相同的问题。货物构建永远不会完成,它将消耗100%的CPU,并将继续消耗内存,直到耗尽

发现相关问题:

两种解决方法:

  • 降级至锈蚀等级1.45.2
  • 切换到异步std运行时以解决此问题<代码>mongodb={version=“1.1.1”,默认特性=false,特性=[“async std runtime”]}

在使用稳定的1.47和“异步std运行时”进行了尝试后,它成功了。在不到一分钟的时间内编译和构建。然后,我再次尝试使用mongodb 1.1.1的默认功能,以检查升级到1.47是否与rust 1.46有所不同,是否具有相同的行为,这需要很长的构建时间,直到它以错误终止。显然,使用async std runtime成功了。是的,如果使用默认功能,则需要降级rust 1.45.2。异步std运行时与1.47兼容