如何窥视频道而不会阻塞并且仍然能够检测到挂断?

问题描述 投票:1回答:2

根据Rust .try_iter()Receiver端的std::mpsc::channel方法的文档,我知道此迭代器要么产生“ None”:

  • 当通道中没有数据时
  • 或当频道的另一端挂断时。

就我而言,我想peek进入频道,而不会阻塞,以便确定是否:

  • 有数据(但without正在消耗它),或
  • 没有数据,或
  • 频道已挂断。

问题是,如果我..

peek

..我只能区分两种情况。

我如何窥视通道的match my_receiver.try_iter().peekable().peek() { Some(data) => {/* there is data */} None => {/* there is no data, but there may be later.. or maybe not, because the channel has maybe hung up, I can't tell! */} } 端并在可能的结果之间进行区分,而不会阻塞或消耗某些数据呢?

rust nonblocking channel peek
2个回答
0
投票

您可以使用receiver做您想做的事。

返回try_recv,并且Result<T, TryRecvError>可以是TryRecvErrorEmpty

Disconnected

0
投票

match my_receiver.try_recv() { Ok(data) => {/* handle data */} Err(TryRecvError::Disconnected) => {/* handle sender disconnected */} Err(TryRecvError::Empty) => {/* handle no data available yet */} } 方法返回一个丢弃try_iter()值的迭代器,因此您无法区分大小写。

您可以创建自己的迭代器,该迭代器在Error上进行迭代,而不是丢弃错误值:

Result

然后您将能够获得一个可窥视的迭代器,该迭代器将返回三个可能的条件:

pub struct TryIterResult<'a, T: 'a> {
    rx: &'a Receiver<T>,
}

pub fn try_iter_result<'a, T>(rx: &'a Receiver<T>) -> TryIterResult<'a, T> {
    TryIterResult { rx: &rx }
}

impl<'a, T> Iterator for TryIterResult<'a, T> {
    type Item = Result<T, TryRecvError>;

    fn next(&mut self) -> Option<Result<T, TryRecvError>> {
        match self.rx.try_recv() {
            Ok(data) => Some(Ok(data)),
            Err(TryRecvError::Empty) => Some(Err(TryRecvError::Empty)),
            Err(TryRecvError::Disconnected) => None
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.