Ejecutar una función periódicamente en el protocolo twisted


Estoy buscando una manera de enviar periódicamente algunos datos sobre todos los clientes conectados a un puerto TCP. Estoy mirando a twisted Python y estoy al tanto del reactor.callLater. Pero, ¿cómo lo uso para enviar algunos datos a todos los clientes conectados periódicamente ? La lógica de envío de datos está en la clase Protocol y es instanciada por el reactor según sea necesario. No se como conectarlo desde el reactor a todas las instancias de protocolo...

Author: Amit, 2008-11-25

2 answers

Probablemente quieras hacer esto en la fábrica para las conexiones. La Fábrica no se notifica automáticamente cada vez que se realiza una conexión y se pierde, por lo que puede notificarlo desde el Protocolo.

Aquí hay un ejemplo completo de cómo usar twisted.Internet.tarea.LoopingCall junto con una fábrica básica personalizada y un Protocolo para anunciar que 'han pasado 10 segundos' a cada conexión cada 10 segundos.

from twisted.internet import reactor, protocol, task

class MyProtocol(protocol.Protocol):
    def connectionMade(self):
        self.factory.clientConnectionMade(self)
    def connectionLost(self, reason):
        self.factory.clientConnectionLost(self)

class MyFactory(protocol.Factory):
    protocol = MyProtocol
    def __init__(self):
        self.clients = []
        self.lc = task.LoopingCall(self.announce)
        self.lc.start(10)

    def announce(self):
        for client in self.clients:
            client.transport.write("10 seconds has passed\n")

    def clientConnectionMade(self, client):
        self.clients.append(client)

    def clientConnectionLost(self, client):
        self.clients.remove(client)

myfactory = MyFactory()
reactor.listenTCP(9000, myfactory)
reactor.run()
 38
Author: Jerub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-26 03:34:33

Me imagino que la forma más fácil de hacerlo es administrar una lista de clientes en el protocolo con connectionMade y connectionLost en el cliente y luego usar un LoopingCall para pedir a cada cliente que envíe datos.

Eso se siente un poco invasivo, pero no creo que quieras hacerlo sin que el protocolo tenga algún control sobre la transmisión/recepción. Por supuesto, tendría que ver su código para saber realmente cómo encajaría bien. ¿Tienes un enlace de github? :)

 3
Author: Dustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-24 23:19:48