在 actix-web 路由处理程序中使用预先计算的大对象
Use precomputed big object in actix-web route handler
有没有办法让 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();
}
首先,创建一个结构,它是您应用程序的共享状态:
struct AppState {
my_big_heavy_object: HeavyObject,
}
最好像这样创建一个上下文包装器,而不是只使用 HeavyObject
,这样您以后可以根据需要向其中添加其他字段。
Actix 中的一些对象现在需要与之交互,因此您可以通过覆盖这些类型中的应用程序状态参数让它们知道它,例如 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
之类的东西来实现内部可变性。
有没有办法让 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();
}
首先,创建一个结构,它是您应用程序的共享状态:
struct AppState {
my_big_heavy_object: HeavyObject,
}
最好像这样创建一个上下文包装器,而不是只使用 HeavyObject
,这样您以后可以根据需要向其中添加其他字段。
Actix 中的一些对象现在需要与之交互,因此您可以通过覆盖这些类型中的应用程序状态参数让它们知道它,例如 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
之类的东西来实现内部可变性。