首页 > 解决方案 > 从 StreamReader 读取而不消耗

问题描述

我需要在不消耗内部缓冲区的情况下在使用创建的实例中建立StreamReader新连接时读取。Serverasyncio.start_server

我尝试完成的第一件事是创建StreamReader传递给处理连接的回调的对象的深层副本,但它会引发错误。

第二件事是StreamReader通过复制缓冲区和transport传递的StreamReader

async def _handle_req(self, reader: StreamReader, writer: StreamWriter):

            reader_copy = StreamReader()
            reader_copy._buffer = deepcopy(reader._buffer)
            reader_copy.set_transport(reader._transport)

但是,当涉及到从中调用时readlinereader_copy它会引发IncompleteReadError异常。在进行了一些调试后,我发现异常是由类的内部readuntil函数引发的streams.py StreamReader(第 626 行),因为由于某种原因内部self._eof标志设置为True. 这发生在_wait_for_data方法的第 515 行

...
self._waiter = self._loop.create_future()
        try:
            await self._waiter
        finally:
            self._waiter = None

因为await self._waiter出于某种原因将其设置为True.

是否有替代解决方案或创建副本的方法StreamReader

标签: pythonsocketspython-asynciostreamreader

解决方案


推荐阅读