代码之家  ›  专栏  ›  技术社区  ›  Jivan

在actix Web路由处理程序中使用预计算的大对象

  •  1
  • Jivan  · 技术社区  · 6 年前

    有没有办法 actix-web 路由处理程序知道预先计算的重对象,这是计算 result ?

    最后,我要做的是避免重新计算 my_big_heavy_object 每次有一个请求出现,而不是一次性计算它。 main ,从 index 方法。

    extern crate actix_web;
    use actix_web::{server, App, HttpRequest};
    
    fn index(_req: HttpRequest) -> HttpResponse {
        // how can I access my_big_heavy_object from here?
        let result = do_something_with(my_big_heavy_object);
        HttpResponse::Ok()
            .content_type("application/json")
            .body(result)
    }
    
    fn main() {
        let my_big_heavy_object = compute_big_heavy_object();
    
        server::new(|| App::new().resource("/", |r| r.f(index)))
            .bind("127.0.0.1:8088")
            .unwrap()
            .run();
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Peter Hall    6 年前

    struct AppState {
        my_big_heavy_object: HeavyObject,
    }
    

    HeavyObject

    HttpRequest<AppState>

    index HttpRequest state

    fn index(req: HttpRequest<AppState>) -> HttpResponse {
        let result = do_something_with(req.state.my_big_heavy_object);
        HttpResponse::Ok()
            .content_type("application/json")
            .body(result)
    }
    

    当建立 App with_state 构造函数而不是 new

    server::new(|| {
            let app_state = AppState { my_big_heavy_object: compute_big_heavy_object() };
            App::with_state(app_state).resource("/", |r| r.f(index))
        })
        .bind("127.0.0.1:8088")
        .unwrap()
        .run();
    

    请注意,假定应用程序状态是不可变的。听起来你不需要任何处理程序来改变它,但是如果你这样做了,你就必须使用 Cell RefCell

    推荐文章