2012-04-24 65 views
1

請考慮以下情形:服務器上的進程用於處理來自網絡連接的數據。 Twisted使用spawnProcess可以非常容易地將網絡端的協議連接到ProcessTransport扭曲應用程序中的內存邊界

但是,我無法確定Twisted如何處理來自網絡的數據可用速度快於進程對其標準輸入執行讀取的情況。就我所見,Twisted代碼大多使用內部緩衝區(self._buffer或類似的)來存儲未消耗的數據。這是否意味着來自快速連接(例如通過本地千兆局域網)的併發請求可能會佔用主內存並導致大量交換,從而使情況更糟?這怎麼能被阻止?

理想情況下,內部緩衝區將有一個上限。據我瞭解,如果操作系統的緩衝區已滿,操作系統的網絡代碼會自動停止連接/開始丟棄數據包,這會降低客戶端速度。 (是的,我知道,網絡級別的DoS仍然有可能,但這是一個不同的問題)。這也是我自己實現它的方法:如果內部緩衝區已滿,則不要從套接字讀取數據。

對我而言,限制最大請求大小也不是一個選項,因爲服務應該能夠處理任意大小的文件。

回答

5

該解決方案有兩個部分。

一部分被稱爲生產者。生產者是數據出來的對象。 TCP運輸是一個生產者。生產者有幾個有用的方法:pauseProducingresumeProducingpauseProducing導致傳輸停止從網絡讀取數據。 resumeProducing導致它再次開始閱讀。這爲您提供了一種避免在尚未處理的內存中構建無限量數據的方法。當你開始落後時,只需暫停運輸。當你趕上時,恢復它。

另一部分叫做消費者。消費者是數據進入的對象。 TCP傳輸也是一種消費者。但對你的情況來說更重要的是,兒童流程運輸也是一種消費者。消費者有幾種方法,特別是對你有用:registerProducer。這告訴消費者哪些生產者數據來自它。消費者可以根據其處理數據的能力調用pauseProducingresumeProducing。當傳輸(TCP或進程)無法像生產者要求發送數據那樣快速發送數據時,它會暫停生產者。當它趕上時,它會再次恢復。

您可以read more about producers and consumers in the Twisted documentation