Rust:如何对已经在容器中的项目进行单独引用?

fslejnso  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(81)

我的服务器正在处理大约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或类似的文件中。这就是我的问题所在:对于特殊客户端,我应该使用什么类型的指针,也许我需要修改我的容器,以便能够从两个指针(一个专用指针和容器中的指针)指向同一个对象?

pqwbnv8z

pqwbnv8z1#

我已经解决了容器部分。它看起来“太嵌套”,但这是事实。

pub type SharedClient = Arc<RwLock<Client>>;
pub type SharedClientList = Arc<RwLock<HashMap<u64, SharedClient>>>;

额外奖励:我现在可以得到一个Client,它既可以是写/可变的,也可以是读/不可变的,这取决于从容器中选择它的程序是否应该改变它。

  • 评论:为此向Rust击掌,如果不是被迫的话,我可能永远不会使用容器的不同访问。

编辑:特殊客户端也必须受到锁的保护,因为它在操作过程中获得其值,当可能有多个客户端设置它时。它永远不会发生,但只是因为客户端的行为,对此没有硬性保证。

special_client: Arc<RwLock<Option<SharedClient>>>,

它将在 write lock下使用一次,然后始终使用 read lock。
请评论,如果我做错了。

相关问题