Linux 添加对mongodb的异步调用后,actix web with mongodb项目无法生成
我正在为数据后端使用actix web和mongodb实现REST API。我使用的是crates.io和rust 1.46中官方rust mongodb驱动程序的1.1.1版 例如,如果我添加代码来调用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
货物检查
没有显示错误或警告,货物构建
花费了很长时间,然后以无法编译我的项目的错误和终止(信号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”]}