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
。你可以把它放在
弧中
,也可以使用
惰性静态
。下面是一个使用
惰性静态
的例子:但在使用互斥体时要小心,因为你可能会遇到一个称为“死锁”的问题