отправка случайных данных с помощью Twisted - PullRequest
1 голос
/ 04 ноября 2010

Я пытаюсь создать приложение, которое максимально использует нисходящий поток пользователя, непрерывно отправляя данные.Существует ли переменная, которая сообщает, сколько байтов находится в буфере вывода?И я говорю «вне буфера», но есть ли лучший термин для данных, которые буферизуются до их отправки клиенту?Я иду об этом правильным путем?Это не кажется практичным для self.transport.write () 100 мегабайт.

1 Ответ

2 голосов
/ 04 ноября 2010

Twisted предоставляет эту информацию с помощью пары API, обычно называемых «производителями» и «потребителями».Вы можете найти документ о них на сайте 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)

Это будет посылать случайные данные на клиента как можно быстрее.

...