< 返回版块

mtio 发表于 2020-03-04 20:06

Tags:actix-web

官方文档和例子,创建共享变量用的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

评论区

写评论
作者 mtio 2020-03-04 22:39

解决了,参考web::Data实现from_request的方式解决的,直接使用web::Data会有double arc的问题。

1 共 1 条评论, 1 页