如何在Twisted HTTP客户端中限制下载速度?

3

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

2个回答

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调用之间有很长的延迟,它可能会比您预期的要慢。 但修复这个问题只是做更多的基于时间的数学计算。


0

我猜这个帖子的作者遇到了一个相关问题,而被广泛接受的智慧是通过在自己的代码中使用锁来顺序运行agent.request以控制速率。希望对你有所帮助。


“最大并发连接数”与“最大带宽”是不同的。另一方面,原帖并不是完全清晰的… - Glyph
是的,它们确实不同,而且问题含糊不清。答案的要点是对发出的 agent.request 进行手动控制,但是您是正确的,这些问题不应该被称为非常相似。 - mockinterface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接