如何在Rust中的不同套接字处理之间共享用户哈希Map?

3lxsmp7m  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(352)

嗨,我是Rust的新手,我正在学习Async(时雄crate)和所有权。为了做到这一点,我正在开发一个聊天服务器,我想有一些基本的登录选项。为此,我使用了一个HashMap,将用户保存为key,密码保存为value。代码如下:

async fn main(){
      let mut users_map: HashMap<String,String> = HashMap::new();
      let listener = TcpListener::bind("localhost:8881").await.unwrap();
      //stuff
      loop{
          let (mut socket, addr) = listener.accept().await.unwrap();
          //more stuff
          tokio::spawn( async move {
               if users_map.contains_key(&user)==true{ //Here is the problem
                     //more stuff
                     users_map.insert(user, password);
               }            
          }
      }
}

所以根据我在Rust书中读到的,当我使用if时,值会移动到那个语句,这样我就不会在那个作用域之外丢失它。但是,我该如何使用为所有作用域定义的哈希Map进行操作呢?我尝试过克隆,但是如果我克隆它,我会为每个连接接受创建一个哈希Map,所以这真的很糟糕,因为我希望所有的“任务”都有一个共享的哈希Map。
谢谢

lg40wkob

lg40wkob1#

您可以使用ArcDashMapDashMap来自dashmap板条箱。例如:

let users_map = Arc::new(DashMap::<String, String>::new());
...
loop {
    let map_clone = users_map.clone();
    tokio::spawn( async move {
        if map_clone.contains_key(&user)==true{ //Here is the problem
            //more stuff
            map_clone.insert(user, password);
        }            
    }
...

相关问题