使用Twisted发送随机数据
我正在尝试创建一个应用程序,目的是通过不断发送数据来让用户的下载速度达到最大。请问有没有一个变量可以告诉我输出缓冲区里有多少字节?我提到的“输出缓冲区”,有没有更好的说法来描述那些在发送给客户端之前被暂时存储的数据?我这样做是否正确?一次性调用self.transport.write()发送100兆字节的数据似乎不太实际。
1 个回答
2
Twisted提供了一种方式来处理信息,主要通过两个叫“生产者”和“消费者”的接口。你可以在Twisted的网站上找到关于它们的文档。
在你的情况下,使用“拉取生产者”可能比较合适,因为你的随机数据可能不是来自某个事件源,而是可以根据需要生成的。大致的示例可能是这样的(希望上面链接的文档能解释为什么这样做有效):
from os import urandom
from zope.interface import implements
from twisted.internet.interfaces import IPullProducer
class RandomProducer(object):
implements(IPullProducer)
def __init__(self, consumer):
self.consumer = consumer
def resumeProducing(self):
self.consumer.write(urandom(2 ** 16))
def stopProducing(self):
pass
举个例子,当连接建立时,你可以把这个生产者注册到传输层:
from twisted.internet.protocol import Protocol
class RandomProtocol(Protocol):
def connectionMade(self):
self.transport.registerProducer(RandomProducer(self.transport), False)
这样就可以尽可能快地向客户端发送随机数据。