我需要发送大量(大约 50 个)HTTP POST 请求,每个请求的大小约为 5 MB。我使用 asyncio.gather 函数来等待这些请求的响应。但是,JSON 序列化过程大约需要 30-40 毫秒,并且会阻塞 EventLoop。
这会导致所有请求同时发送到服务器。例如,如果有 50 个请求,并且第一个请求在时间 T 可用,则仅在 (T + (50 * 30) = T + 1500ms) 发送。此外,在 T+1500 毫秒时,所有 50 个请求都发送到服务器。我希望 Aiohttp 在请求可用时立即发送请求。
我可以绕过 JSON 序列化步骤来实现此目的吗?
此外,这一行是aiohttp等待事件循环的地方。我们的 API 对延迟敏感。有什么办法可以加快这个速度吗?或者还有其他替代方案吗?
听起来您正在使用
json
便捷参数来发送 JSON 响应。对于如此大的请求,并且如果性能至关重要,那么听起来您最好事先对其进行编码。
例如比如:
def prepare_data(obj) -> bytes:
return json.dumps(obj).encode()
data = await asyncio.to_thread(prepare_data, obj)
async with sess.post(data=data, headers={"Content-Type": "application/json"}) as resp:
请注意,在此期间无法修改
obj
(最好是不可变的东西)。
此外,这一行是 aiohttp 等待事件循环的地方。我们的 API 对延迟敏感。有什么办法可以加快这个速度吗?或者还有其他替代方案吗?
如果您安装
aiohttp[speedups]
,它将包含 aiodns,这应该会加快 DNS 解析速度。或者,您可以传递 IP 地址以完全跳过 DNS 解析。