v1z*_*1z3 3 python python-asyncio aiohttp
在 python 中使用 asyncio 时,我们如何确定 read() 的最佳参数?12字节?100 字节?
async with self._session.get(url, headers=headers) as response:
chunk_size = 12
result = ''
while True:
chunk = await response.content.read(chunk_size)
if not chunk:
break
elif isinstance(chunk, (bytes, bytearray)):
data = chunk.decode('utf8')
result += data
Run Code Online (Sandbox Code Playgroud)
在 python 中使用 asyncio 时,我们如何确定 read() 的最佳参数?12字节?100 字节?
您可以安全地选择比该数字大得多的数字。如果数字太小(例如只有 1),则循环将包含许多对 的调用StreamReader.read,每个调用都会带来固定的开销 - 它必须检查缓冲区中是否有内容,然后返回其中的一部分并更新剩余的缓冲区,或者等待新的东西到达。另一方面,如果请求的大小过大,理论上可能需要不必要的大量分配。但由于StreamReader.read允许返回的数据少于指定的数据,因此它永远不会返回大于内部缓冲区(默认为64 KiB )的块,因此这不是问题。
总之:任何高于 1024 左右的数字都可以,因为它足够大,可以避免不必要的函数调用。在大多数情况下,请求超过 65536 与请求 65536 相同。当我不关心绝对最佳性能时,我倾向于请求 1024 字节(较小的块在调试时更容易看清),而当我不关心绝对最佳性能时,我倾向于请求 16384 等较大的值。做。顺便说一句,数字不一定是 2 的幂,这只是较低级语言的约定。
当专门处理 aiohttp 流时,您可以调用readany,该方法仅返回任何可用数据,如果没有可用数据,则等待一些数据到达并返回该数据。如果您正在处理 aiohttp 流,这可能是最好的选择,因为它只为您提供内部缓冲区的数据,而不必考虑其大小。