结构是这样
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是外部传进来的方法
1
共 2 条评论, 1 页
评论区
写评论多谢 对以下内容的回复:
一般来说,你想操作多个引用 如果是单线程:就用Rc,如果需要改动就搭配Rc 如果是多线程:就用Arc,但是Arc不能DrefMut,而Hashmap的insert签名是&mut self,如果要改动就搭配Arc,注意用parkinglot的RwLock,不要用std的,性能差挺大的。 如果你还是觉得RwLock性能不好,就用内部可变的第三方集合类,比如CHashmap 可以直接Arc