Frage Eine Funktion periodisch im verdrehten Protokoll ausführen


Ich suche nach einer Möglichkeit, einige Daten regelmäßig über alle Clients zu senden, die an einen TCP-Port angeschlossen sind. Ich schaue auf twisted python und ich kenne reactor.callLater. Aber wie verwende ich es, um regelmäßig Daten an alle angeschlossenen Clients zu senden? Die Datensende-Logik befindet sich in der Protokollklasse und wird vom Reaktor nach Bedarf instanziiert. Ich weiß nicht, wie man es vom Reaktor an alle Protokoll-Instanzen bindet ...


23
2017-11-24 22:21


Ursprung


Antworten:


Wahrscheinlich möchten Sie dies in der Factory für die Verbindungen tun. Die Factory wird nicht automatisch jedes Mal benachrichtigt, wenn eine Verbindung hergestellt oder verloren wird, sodass Sie sie über das Protokoll benachrichtigen können.

Hier ist ein vollständiges Beispiel, wie man twisted.internet.task.LoopingCall in Verbindung mit einer angepassten Standard-Factory und einem Protokoll verwendet, um alle 10 Sekunden anzuzeigen, dass 10 Sekunden vergangen sind.

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

37
2017-11-25 07:12



Ich könnte mir vorstellen, dass dies am einfachsten ist, wenn Sie eine Liste von Clients im Protokoll mit connectionMade und connectionLost im Client verwalten und dann einen LoopingCall verwenden, um jeden Client zum Senden von Daten aufzufordern.

Das fühlt sich ein wenig invasiv an, aber ich denke nicht, dass Sie es tun möchten, ohne dass das Protokoll eine gewisse Kontrolle über die Übertragung / den Empfang hat. Natürlich müsste ich deinen Code sehen, um wirklich zu wissen, wie er gut passt. Hast du einen GitHub Link? :)


3
2017-11-24 23:19