Async poll_read 卡在Pending状态问题求助
Async poll_read 卡在Pending状态问题求助
各位Rust的大佬们,我最近在实现一个异步读取的窗口限制结构体AsyncReadWindow,用来限定只能从异步读取器的指定起始位置读取固定大小的内容,但遇到了一个头疼的问题——poll_read方法一直卡在Pending状态,没法正常完成读取,想请大家帮忙看看哪里出问题了🥺
先贴一下我的代码:
use std::error::Error; use std::{cmp::min, pin::Pin, task::Poll}; use futures_lite::io::{AsyncRead, AsyncSeek, ErrorKind, SeekFrom}; use futures_lite::{ready, AsyncSeekExt}; pub struct AsyncReadWindow<R> where R: AsyncRead + AsyncSeek + Unpin, { start: u64, size: u64, reader: R, } impl<R> AsyncReadWindow<R> where R: AsyncRead + AsyncSeek + Unpin, { pub async fn new(mut reader: R, start: u64, size: u64) -> Result<Self, Box<dyn Error>> { reader.seek(SeekFrom::Start(start)).await?; Ok(Self { reader, start, size, }) } } impl<R> AsyncRead for AsyncReadWindow<R> where R: AsyncRead + AsyncSeek + Unpin, { fn poll_read( self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>, buf: &mut [u8], ) -> Poll<std::io::Result<usize>> { // 这里是我写的poll_read逻辑,但好像有问题 let this = self.get_mut(); // 尝试计算剩余可读取的字节数 let current_pos = match this.reader.stream_position().await { Ok(pos) => pos, Err(e) => return Poll::Ready(Err(e.into())), }; let remaining = this.size.saturating_sub(current_pos - this.start); let read_len = min(buf.len() as u64, remaining) as usize; if read_len == 0 { return Poll::Ready(Ok(0)); } // 调用内部reader的poll_read let result = ready!(Pin::new(&mut this.reader).poll_read(cx, &mut buf[..read_len])); match result { Ok(n) => Poll::Ready(Ok(n)), Err(e) => Poll::Ready(Err(e)), } } }
实际测试的时候,当我用这个结构体去读取内容,任务就一直卡在Pending状态,完全没有进展。我猜测可能是在stream_position().await这里出了问题?因为在poll方法里调用await会不会导致上下文的问题?或者是我计算剩余字节的逻辑有问题?
有没有大佬能帮我梳理一下,到底哪里出错了?感激不尽!
备注:内容来源于stack exchange,提问作者SunnyMonster
相关产品推荐
相关产品推荐

