问题:我有一个
File
但我正在维护多个有状态的“连接”。每个连接都对同一个文件执行读取和写入操作,但它们彼此独立执行。我想我能做的最接近的比较是,就好像我有一个打开的 UDP 套接字,但我正在向它强加状态连接。
每当我读取或写入文件时,我想确保预期的连接接收请求并且不被其他连接处理。我认为这可以通过维护某种
HashMap<String, Connection>
来管理:我首先阅读内容,然后确定它用于哪种连接。这就是我在伪代码中描绘的:
pub struct Connection {
pub id: String,
pub content_in: Option<String>,
pub file: File,
...
}
impl Connection {
pub async fn read(&mut self) -> String {
if let Some(content) = self.content_in {
// Reset
self.content_in = None;
return content;
}
while self.content_in.is_none() {
let buf = vec![0; 100];
let size = self.file.read(buf).await.unwrap();
// get connection id from the read in buffer
let conn_id = get_conn_id_from_buf(buf);
// give the intended connection its content
conn_map.get(conn_id).content_in = Some(buf[..size]);
// give back control to executor
task::yield_now().await;
}
let ans = self.content_in.unwrap();
// Reset
self.content_in = None;
ans
}
}
有没有更好的方法来管理这个?我在想我也许可以实现自己的未来;如果我看到我当前的连接有一个非 None
content_in
那么我就是 Poll::Ready(String)
,否则我需要继续在缓冲区中读取并继续等待。我不确定这是否是一个好的甚至可行的解决方案;例如,您甚至可以在 self.file.read(buf).await
函数中调用 poll()
(它甚至不是异步的)吗?