Tôi đang cố gắng đặt giới hạn tốc độ khi tải xuống/tải lên tệp và thấy rằng xoắn cung cấp twisted.protocols.policies.ThrottlingFactory để xử lý công việc này, nhưng tôi không thể làm đúng. Tôi đặt readLimit
và writeLimit
nhưng tệp vẫn tải xuống ở tốc độ tối đa. Tôi đang làm gì sai?Điều chỉnh băng thông bằng cách sử dụng Twisted
from twisted.protocols.basic import FileSender
from twisted.protocols.policies import ThrottlingFactory
from twisted.web import server, resource
from twisted.internet import reactor
import os
class DownloadPage(resource.Resource):
isLeaf = True
def __init__(self, producer):
self.producer = producer
def render(self, request):
size = os.stat(somefile).st_size
request.setHeader('Content-Type', 'application/octet-stream')
request.setHeader('Content-Length', size)
request.setHeader('Content-Disposition', 'attachment; filename="' + somefile + '"')
request.setHeader('Accept-Ranges', 'bytes')
fp = open(somefile, 'rb')
d = self.producer.beginFileTransfer(fp, request)
def err(error):
print "error %s", error
def cbFinished(ignored):
fp.close()
request.finish()
d.addErrback(err).addCallback(cbFinished)
return server.NOT_DONE_YET
producer = FileSender()
root_resource = resource.Resource()
root_resource.putChild('download', DownloadPage(producer))
site = server.Site(root_resource)
tsite = ThrottlingFactory(site, readLimit=10000, writeLimit=10000)
tsite.protocol.producer = producer
reactor.listenTCP(8080, tsite)
reactor.run()
CẬP NHẬT
Vì vậy, đôi khi sau khi tôi chạy nó:
2012-10-25 09:17:03+0600 [-] Unhandled Error
Traceback (most recent call last):
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/application/app.py", line 402, in startReactor
self.config, oldstdout, oldstderr, self.profiler, reactor)
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/application/app.py", line 323, in runReactorWithLogging
reactor.run()
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/internet/base.py", line 1169, in run
self.mainLoop()
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/internet/base.py", line 1178, in mainLoop
self.runUntilCurrent()
--- <exception caught here> ---
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/internet/base.py", line 800, in runUntilCurrent
call.func(*call.args, **call.kw)
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/protocols/policies.py", line 334, in unthrottleWrites
p.unthrottleWrites()
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/protocols/policies.py", line 225, in unthrottleWrites
self.producer.resumeProducing()
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/protocols/basic.py", line 919, in resumeProducing
self.consumer.unregisterProducer()
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/web/http.py", line 811, in unregisterProducer
self.transport.unregisterProducer()
File "/home/chambylov/environments/transfer/local/lib/python2.7/site-packages/twisted/protocols/policies.py", line 209, in unregisterProducer
del self.producer
exceptions.AttributeError: ThrottlingProtocol instance has no attribute 'producer'
tôi thấy rằng tôi không được phép chuyển nhượng nhà sản xuất như tôi biết tsite.protocol.producer = producer
, Tôi mới đến Xoắn và tôi không biết làm thế nào để làm điều đó theo một cách khác.
Nhìn vào nguồn có một dòng, 'lo g.msg ("Điều chỉnh lượt đọc trên% s"% tự) 'bạn có thể xác minh rằng điều này đang được ghi lại không? – John
nó không đăng nhập * throttleReads phương pháp, nhưng nó * throttleWrites: 'Throttling viết trên' –
Tôi nghĩ bạn phải chèn đối tượng Throttling hoặc giữa 'tập tin' đọc và và 'render()', hoặc có lẽ tốt hơn giữa 'reactor' và' render/DownloadPage instance' của bạn. Ngay bây giờ bạn dường như truyền 'producer' cho cả hai đối tượng DownloadPage và Throttling, điều này có vẻ không đúng. –