有没有办法限制Twisted http客户端的下载速率?如果没有,在Twisted中实现这样一个客户端最简单的方法是什么?
答案 0 :(得分:4)
Twisted中的流控制最常使用IProducer.pauseProducing
和IProducer.resumeProducing
来实现。
您需要自己测量来自制作人的吞吐量,并在适当的时间调用pauseProducing
和resumeProducing
,以将带宽使用限制在您正在寻找的水平。
使用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。