改进 Rust 中的持续等待

问题描述 投票:0回答:0

问题:我有一个

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()
(它甚至不是异步的)吗?

asynchronous rust rust-tokio
© www.soinside.com 2019 - 2024. All rights reserved.