2010-11-04 8 views
1

J'essaie de créer une application qui maximise l'aval de l'utilisateur en envoyant des données en continu. Y at-il une variable qui indique combien d'octets sont dans le tampon de sortie? Et je dis «hors tampon», mais y a-t-il un meilleur terme pour les données qui sont tamponnées avant d'être envoyées au client? Est-ce que je vais à ce sujet de la bonne façon? Cela ne semble pas pratique à self.transport.write() 100 mégaoctets.envoyer des données aléatoires avec Twisted

Répondre

2

La façon dont Twisted expose cette information se fait avec une paire d'API communément appelées «producteurs» et «consommateurs». Vous pouvez trouver a document à leur sujet sur le site Twisted.

Dans votre cas, un "pull producer" est probablement approprié, car vos données aléatoires ne proviennent probablement pas d'une source d'événement, mais peuvent être générées à la demande. Une esquisse pourrait ressembler à ceci (et nous espérons que le document lié ci-dessus expliquent pourquoi cela fonctionne):

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 

Ainsi, par exemple, lorsqu'une connexion est établie, vous pouvez enregistrer ce producteur avec le transport:

from twisted.internet.protocol import Protocol 

class RandomProtocol(Protocol): 
    def connectionMade(self): 
     self.transport.registerProducer(RandomProducer(self.transport), False) 

Ceci enverra des données aléatoires au client aussi vite que possible.

Questions connexes