我的服务器正在处理大约50-100个客户端,这些客户端与WebSocket连接,我使用simple_websockets库。
客户端可以随时连接,也可以随机断开连接。当客户端连接时,它从 simple_websockets 获取u64
标识符,我使用此ID作为容器的密钥,看起来像:
pub type ClientList = Arc<RwLock<HashMap<u64, Client>>>;
我怀疑它不是最优的,我不确定,也许我错了,但是如果我从它得到一个Client
,它将被锁定,直到作用域结束,在这个例子中,process_stuff()
完成。
// self.clients: ClientList (defined elsewhere)
let mut hash_map = self.clients.write().unwrap();
let client: &mut Client = hash_map.get_mut(&client_id).unwrap();
client.process_stuff();
其中一个客户端是特殊的客户端。它在服务器启动时没有连接,它会像其他客户端一样连接,服务器会检测它是否是特殊的客户端。它也应该被放入容器中,因为它必须像其他客户端一样工作,它只有一些特殊的任务。此外,应该有一个快速访问它的方法。一个专用的指针。我会通过只存储它的ID来避免指针,每次都从容器中拾取它,但这会很慢。
我不能使用一个简单的指针,因为特殊的客户端在服务器启动时并不存在,它必须被 Package 到Option
或类似的文件中。这就是我的问题所在:对于特殊客户端,我应该使用什么类型的指针,也许我需要修改我的容器,以便能够从两个指针(一个专用指针和容器中的指针)指向同一个对象?
1条答案
按热度按时间pqwbnv8z1#
我已经解决了容器部分。它看起来“太嵌套”,但这是事实。
额外奖励:我现在可以得到一个
Client
,它既可以是写/可变的,也可以是读/不可变的,这取决于从容器中选择它的程序是否应该改变它。编辑:特殊客户端也必须受到锁的保护,因为它在操作过程中获得其值,当可能有多个客户端设置它时。它永远不会发生,但只是因为客户端的行为,对此没有硬性保证。
它将在 write lock下使用一次,然后始终使用 read lock。
请评论,如果我做错了。