方法 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 直到收到预期的字节数。
- 我理解的
read(byte_count)
正确吗?
- 有没有其他人观察到同样的行为?
我目前的解决方法是检查收到的字节数。如果不完整,请使用剩余字节数再次调用 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
我观察到 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 直到收到预期的字节数。
- 我理解的
read(byte_count)
正确吗? - 有没有其他人观察到同样的行为?
我目前的解决方法是检查收到的字节数。如果不完整,请使用剩余字节数再次调用 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