Rust 跨异步闭包共享数据结构
我一直在尝试在异步助手之间共享(只读)数据结构。我试图完成的是创建一个超级服务器,在这里我预先生成一些数据,供所有请求处理程序使用 以下是《超级入门指南》中的示例,扩展了我的工作:Rust 跨异步闭包共享数据结构,rust,rust-tokio,hyper,Rust,Rust Tokio,Hyper,我一直在尝试在异步助手之间共享(只读)数据结构。我试图完成的是创建一个超级服务器,在这里我预先生成一些数据,供所有请求处理程序使用 以下是《超级入门指南》中的示例,扩展了我的工作: #[tokio::main] async fn main() { let address = SocketAddr::from(([127, 0, 0, 1], 3000)); let pages = generate_static_pages(); let make_service =
#[tokio::main]
async fn main() {
let address = SocketAddr::from(([127, 0, 0, 1], 3000));
let pages = generate_static_pages();
let make_service = make_service_fn(|_conn| async move {
Ok::<_, Infallible>(service_fn(|req: Request<Body>| async move {
serve(pages, req)
}))
});
let server = Server::bind(&address).serve(make_service);
if let Err(error) = server.await {
eprintln!("server error: {}", error);
}
}
#[tokio::main]
异步fn main(){
let address=SocketAddr::from([127,0,0,1],3000));
让页面=生成静态页面();
让make_service=make_service_fn(| | u conn |异步移动{
Ok::(服务|请求|异步移动{
服务(页数,要求)
}))
});
让server=server::bind(&address).service(make\u service);
如果let Err(error)=server.wait{
eprintln!(“服务器错误:{}”,错误);
}
}
在我的例子中,
generate\u static\u pages()
返回一个HashMap如果您只想要对页面的不可变引用,那么您应该能够使用lazy\u static
板条箱<代码>惰性静态
允许您在运行时初始化静态变量-这非常有用
您的代码最终会看起来像:
使用lazy\u static::lazy\u static;
懒惰的人!{
静态参考页面:hashmap出于好奇,如果我确实想要可变访问,我将如何解决它?干杯!在每个节点或整个映射上使用Arc
,或者使用concurent hashmap(例如:evmap)正如@AsyaCorbeau所说,为了允许内部的可变性,你必须使用互斥体
或RefCell
。你可以把它放在弧中
,也可以使用惰性静态
。下面是一个使用惰性静态
的例子:但在使用互斥体时要小心,因为你可能会遇到一个称为“死锁”的问题