方法 asyncio.streams.StreamReader.read(byte_count) 读取的字节太少

Method asyncio.streams.StreamReader.read(byte_count) reads too few bytes

我观察到 asyncio/Python3.4/Windows7 的一些罕见行为,其中 asyncio.streams.StreamReader.read(byte_count) 读取少于 byte_count 字节。我无法可靠地重现该行为,但有足够的网络 activity(1000 次读取),我可能会看到它 一次

read(byte_count) 的文档说:Read up to n bytes.

参考:https://docs.python.org/3/library/asyncio-stream.html#streamreader

英文短语 "up to" 表示它有时可能读得少 (!)。正如我最初理解协同程序的行为:它不会 return 直到收到预期的字节数。

  1. 我理解的 read(byte_count) 正确吗?
  2. 有没有其他人观察到同样的行为?

我目前的解决方法是检查收到的字节数。如果不完整,请使用剩余字节数再次调用 read(byte_count)。 (但这似乎违背了read(byte_count)的目的。)

是的,您理解正确:read(n) 可能 return 小于 n。这是正常的,您应该重复读取,直到由于 EOF 或某些错误而无法获得更多字节。

您应该使用 StreamReader.readexactly() 而不是 StreamReader.read(): "Read exactly n bytes." https://docs.python.org/3/library/asyncio-stream.html#asyncio.StreamReader.readexactly