使用Twisted进行带宽调节

2024-06-18 11:27:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图设置下载/上传文件的速度限制,发现twisted提供了twisted.protocols.policies.ThrottlingFactory来处理这项工作,但我做不到。我设置了readLimitwriteLimit,但文件仍在以最高速度下载。我做错什么了?在

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()

更新

所以在我运行之后的某个时候:

^{pr2}$

我知道我不应该像我所知道的那样指派制作人tsite.protocol.producer = producer,我是Twisted的新手,我不知道如何用另一种方法。在


Tags: producerfromimportselfsizeserverrequestdef
2条回答

正如egbutter所说,你必须注册一个制作人。所以不是这样:

tsite.protocol.producer = producer

必须显式调用registerProducer方法:

^{pr2}$

或者,如果您使用FileSender作为生产者,请调用它的beginFileTransfer方法,在我们的例子中:

file_to_send = open( ... )
producer.beginFileTransfer(file_to_send, tsite.protocol)

Every producer needs (eventually) to be registered with whatever you want to consume the data。我看不到任何地方有登记。也许这就是你现在的问题?在

Twisted已经在一些大型项目中使用过,比如Friendster,但是所有的回调都不符合我用python编写的通常方式(而且我有一些函数式编程的经验)。我切换到gevent。在

如果您使用的是gevent库,那么许多细节(提供异步功能的回调/生成器)都会被抽象出来,因此您通常只需简单地修补代码并以您习惯的面向对象风格编写代码就可以了。如果你和不熟悉js/lisp等回调重语言的人一起工作,我打赌他们会喜欢gevent而不是twisted。在

相关问题 更多 >