2011-07-30 49 views
1

我有一个脚本每秒向服务器发送5-10次请求。我拥有的最重要的要求是每秒请求数的限制。它必须始终是具体的数字,不能更多也不能少。要做到这一点,我发送请求后给定的时间间隔(减去发送前一个请求所需的时间)。加快套接字发送行为(使用Python)

问题:某些请求发送速度不够快,但其他请求在sock.sendall()步骤中花费太多时间。我相信这是因为发送缓冲区已满并且执行被阻止,直到缓冲区被清除。

我该怎么做才能更快地刷新缓冲区?

一个我所尝试的选项是禁用的Nagle:

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

,但它似乎没有改善的事情。

另一种听起来太错误的方法是在每个sendall()调用之前将发送缓冲区设置为请求的长度。

有什么我可以做到每秒获得更多可预测的请求?

我刚才想到的另一个选项:有几个进程每秒会做少量的请求,希望它会使结果更可预测。

有问题的操作系统是Centos。

更新:这似乎是我在连接后设置套接字选项的错误。看起来只能在connect()调用之前设置大小缓冲区。与TCP_NODELAY相同。还没有时间来测试它是否有所作为。

+0

其中一些可能无法控制,这是由于网络问题或服务器端的限制。 – Keith

回答

2

我最关键的要求是每秒请求数的限制。 它必须始终是具体的数字,不能多也不能少。

该要求通过TCP完全无法实现。您还需要实时保证服务时间。

+0

有些“冲洗”将使得数据从我的身边发送得更加规律和可预测。目前我经常超出限制。正如你所说,这也可能是由于另一端的服务器造成的...... –

+0

@alexeit您的要求如上所述无法实现。 “更经常”也不符合这一要求。 – EJP

0

(从How can I force a socket to send the data in its buffer?

你不能强迫它。期。 TCP会自行决定何时可以发送数据。现在,通常当您在TCP套接字上调用write()时,TCP确实会发送一个段,但是没有保证,也没有办法强制这样做。 TCP不会发送段的原因有很多:关闭窗口和Nagle算法是需要立即想到的两件事情。

阅读完整的文章,它是相当深入的,并澄清了一些事情,例如,当禁用Nagle算法是有意义的等等。