官方文档和例子,创建共享变量用的web::Data::new
的方式。
let counter = web::Data::new(Mutex::new(Counter { inner: 0 }));
App::new()
.app_data(counter.clone())
但是翻阅web::Data::new
的内部实现会自己创建Arc对象,Data(Arc::new(state))
。
https://docs.rs/actix-web/2.0.0/src/actix_web/data.rs.html#74
现在我有个现成的Arc变量counter
,要在actix-web里全局共享,不知道要如何做?
let counter = Arc::new(Mutex::new(Counter { inner: 0 }));
let srv = HttpServer::new(move || {
App::new()
.app_data(counter.clone())
pub async fn ws_index(
counter: web::Data<Arc<Mutex<Counter>>>,
r: HttpRequest,
stream: web::Payload,
) -> Result<HttpResponse, Error> {
}
在群里有兄弟推荐上面app_data这种方式,但我很疑惑,最后取counter的时候同样用的web::Data<_>取,这种方式没有double arc问题吗?
查看issues,也有人提问,但没看明白。 https://github.com/actix/actix-web/issues/1272 https://github.com/actix/actix-web/issues/1300
1
共 1 条评论, 1 页
评论区
写评论解决了,参考web::Data实现from_request的方式解决的,直接使用web::Data会有double arc的问题。