< 返回版块

243011068 发表于 2020-04-19 11:05

结构是这样

pub struct Context {
    sender: crossbeam_channel::Sender<StreamEvent>,
    proxy_map: HashMap<u32, TcpProxy>,
    session_map: HashMap<u32, Session>,
}

pub async fn send_all_session_msg(&mut self, router: i16, body: &[u8]) {
    for (_, session) in self.session_map.iter_mut() {
            session.send_msg(router, body).await;
    }
}


然后我想调用on_recv_msg方法,希望既能传session和context,传context是为了在on_recv_msg方法里可以调用send_all_session_msg,rust规则肯定不允许这样,从设计上可以怎么设计规避这个问题么?

if let Some(session) = context.session_map.get_mut(&connect_id) {
   self.on_recv_msg(&mut context, session, msg_packer).await;
}

on_recv_msg是外部传进来的方法

评论区

写评论
作者 243011068 2020-04-19 22:23

多谢 对以下内容的回复:

guoxbin 2020-04-19 15:51

一般来说,你想操作多个引用 如果是单线程:就用Rc,如果需要改动就搭配Rc 如果是多线程:就用Arc,但是Arc不能DrefMut,而Hashmap的insert签名是&mut self,如果要改动就搭配Arc,注意用parkinglot的RwLock,不要用std的,性能差挺大的。 如果你还是觉得RwLock性能不好,就用内部可变的第三方集合类,比如CHashmap 可以直接Arc

1 共 2 条评论, 1 页