You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:04:35