2011-07-30 83 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算法是有意義的等等。