加速Python中socket发送行为

1 投票
2 回答
2452 浏览
提问于 2025-04-16 22:33

我有一个脚本,每秒向服务器发送5到10个请求。对我来说,最重要的要求是每秒请求的数量必须是一个固定的数字,不能多也不能少。为此,我会在发送请求之间设置一个时间间隔(减去发送上一个请求所需的时间)。

问题是,有些请求发送得很快,但有些在sock.sendall()这一步花费的时间太长。我觉得这是因为发送缓冲区满了,执行被阻塞,直到缓冲区清空。

我该怎么做才能更快地清空这个缓冲区呢?

我尝试过的一个方法是禁用Nagle算法:

sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

但这似乎没有改善情况。

另一个我觉得可能不太对的方法是,在每次调用sendall()之前,将发送缓冲区的大小设置为请求的长度。

有没有什么办法可以让我每秒的请求数量更可预测呢?

我刚想到的一个方法是,启动几个进程,每个进程每秒发送少量请求,希望这样能让结果更可预测。

我使用的操作系统是Centos。

更新:看起来我在连接后设置套接字选项时出错了。似乎缓冲区的大小只能在调用connect()之前设置。TCP_NODELAY也是如此。我还没时间测试这是否会有任何不同。

2 个回答

0

(来自 我怎么能强制一个套接字发送它缓冲区里的数据?)

你不能强制它。就是这样。TCP会自己决定什么时候发送数据。通常,当你在一个TCP套接字上调用write()时,TCP确实会发送一个数据段,但这并没有保证,也没有办法强制它发送。TCP不发送数据段的原因有很多,比如窗口关闭和Nagle算法,这两点是最常见的。

可以阅读完整的帖子,内容很深入,也帮我澄清了一些问题,比如在什么情况下禁用Nagle算法是有意义的等等。

2

我最重要的需求是每秒请求的数量要有限制。这个数量必须是固定的,不能多也不能少。

这个需求通过TCP协议是完全无法实现的。你还需要确保在对方那边的服务时间是实时可控的。

撰写回答