如何限制Twisted http客户端的下载速率?

时间:2013-12-26 09:53:01

标签: twisted

有没有办法限制Twisted http客户端的下载速率?如果没有,在Twisted中实现这样一个客户端最简单的方法是什么?

2 个答案:

答案 0 :(得分:4)

Twisted中的流控制最常使用IProducer.pauseProducingIProducer.resumeProducing来实现。

您需要自己测量来自制作人的吞吐量,并在适当的时间调用pauseProducingresumeProducing,以将带宽使用限制在您正在寻找的水平。

使用IResponse.deliverBody时,您提供的协议将附加到提供IProducer的对象。当您暂停并恢复该对象时,您将控制从网络读取响应正文的速率。

所以,例如:

class SlowDownloader(Protocol):
    def __init__(self, reactor):
        self.reactor = reactor

    def dataReceived(self, data):
        print 'Received', len(data), 'bytes'
        self.transport.pauseProducing()
        # Delay further reading so that the download proceeds at
        # 1kB/sec at the fastest.
        delay = len(data) / 1024.0
        self.reactor.callLater(delay, self.transport.resumeProducing)

requesting = agent.request(...)
def requested(response):
    response.deliverBody(SlowDownloader())
requesting.addCallback(requested)

这不是一个特别好的限速实施。如果resumeProducing被调用和下一个dataReceived呼叫之间存在长时间延迟,则可能比您想要的要慢。修复这只是做一些基于时间的数学问题。

答案 1 :(得分:0)

我认为这张海报有a related issue,并且人们普遍认为控制费率应该通过在锁定帮助下依次自行运行agent.request来完成。 HTH。