Python中的带宽限制
有没有什么库可以让你控制网络请求的下载速度(特别是http请求)。我在urllib2里面没有看到有什么内置的功能(我打算使用(Py)Qt)。
Twisted可以控制带宽吗?如果不行,我该如何控制urllib2或Twisted的读取缓冲区大小?用sleep
来暂停网络操作不是一个好办法。
2 个回答
9
urllib2这个库本身没有提供直接的方法来实现速率限制,所以你需要自己扩展它的一些类,并自己实现速率限制的功能。你可以看看这个问题。如果你决定自己写一个速率限制器,可以了解一下令牌桶和漏桶这两种算法。
在github上,有一些尝试性的解决方案,比如Phredward/throttle和minkustree/socket-throttle。
另外,你也可以使用pycurl,并结合CURLOPTMAXRECVSPEEDLARGE这个选项。
补充一下,urlgrabber这个包似乎也支持速率限制,而且可能比pycurl更容易理解。
如果你更喜欢使用事件循环模型来编程,可以考虑Twisted这个方法,之前的回答中已经提到过。
8
当然,Twisted是可以做到的。你需要的是twisted.protocols.policies.ThrottlingFactory
。只要在把你现有的工厂传给需要工厂的地方之前,把它包裹在这个里面就可以了。