我观察到asyncio / Python3.4 / Windows7的一些罕见行为,其中asyncio.streams.StreamReader.read(byte_count)
读取的字节少于byte_count
。我无法可靠地重现行为,但有足够的网络活动(1000次读取),我可能会看到一次。
read(byte_count)
的文档说:Read up to n bytes.
参考:https://docs.python.org/3/library/asyncio-stream.html#streamreader
英文短语"直到"表示它有时可能读得少(!)。正如我最初理解协程的行为:直到收到预期的字节数才会返回。
read(byte_count)
?我目前的解决方法是检查收到的字节数。如果不完整,请再次使用剩余字节数调用read(byte_count)
。 (但这似乎打败了read(byte_count)
的目的。)
答案 0 :(得分:3)
是的,您理解正确:read(n)
可能会返回少于n
。这是正常的,你应该重复阅读,直到你因EOF或某些错误而得不到更多的字节。
答案 1 :(得分:1)
您应该使用StreamReader.readexactly()而不是StreamReader.read(): "准确读取n个字节。" https://docs.python.org/3/library/asyncio-stream.html#asyncio.StreamReader.readexactly