Frage

Ich habe ein Python-Programm, das derzeit ein von mir geschriebenes TCP/IP-Clientmodul verwendet, um Daten von einem Streaming-Server zu empfangen.Der Server gibt Datenzeilen aus.

Meine TCP-Client-Klasse ist ziemlich primitiv und ich möchte eine Umgestaltung vornehmen, um eine verdrehte ReconnectingClientFactory zu verwenden.

Das Hauptprogramm erhält derzeit Daten von einer readLines-Funktion in meinem TCP-Client, die die Zeilen beim Empfang „ausgibt“.

Auf die TCP-Client-Methode wird zugegriffen durch:

for msg_buffer in self.myTcpClient.readLines():
    do some stuff with the data in msg_buffer

In meinem TCP-Client sieht die readLines-Methode im Wesentlichen so aus:

while True:
    newLine = self.sock.recv(self.buffer_size)
    yield newLine

Wenn ich den Twisted-Client implementieren möchte, möchte ich, dass er sich wie ein Iterator verhält und Daten liefert.Ich gehe davon aus, dass ich etwas in der Protokollmethode „dataReceived“ tun würde.

Ich versuche nicht herauszufinden, wie das funktioniert.Es scheint mir, dass Twisted Deferred für diese Art von Verwendung gedacht ist, aber ich kann nicht herausfinden, wie ich ein Deferred für meinen Zweck verwenden kann (wenn meine Annahme über Deferred richtig ist).

In einer perfekten Welt würde der verdrehte Client die Leitungen so zurückgeben, wie sie empfangen wurden, sodass ein Aufruf ähnlich der vorliegenden Methode die Aufgabe erfüllen würde.d.h.

class GetData(protocol):
    def dataReceived(self, data):
        yield data

Aber ich denke, das ist eine zu starke Vereinfachung.

Zusammenfassend versuche ich, einen verdrehten TCP-Client für die erneute Verbindung zu implementieren, der sich in etwa wie meine readLines-Methode verhält und auf den mehr oder weniger zugegriffen werden kann:

for msg_buffer in self.twistedTcpClient.readLines():

Alle Hinweise werden sehr geschätzt

AKTUALISIEREN:Ich bin gerade zufällig auf „Crochet“ für Twisted gestoßen.Auf den ersten Blick scheint Crochet genau für die Art von Modell entworfen worden zu sein, die ich brauche ...Ich melde mich nach einigen Tests wieder

War es hilfreich?

Lösung

Der verdrehte Weg, dies zu tun, wäre, ein Protokoll zu schreiben.Anstatt zu tun:

for line in self.twistedTcpClient.readLines():
    process_line(line) ...

Sie würden Ihr Protokoll schreiben (vielleicht durch Unterklassenbildung von a twisted.protocols.basic.LineReceiver):

class MyProtocol(LineReceiver):
    ...
    def lineReceived(self, line):
        process_line(line) ...

Sie möchten Ihren Code umgestalten, um die zu verwenden lineReceived Rückruf anstelle einer iterierten Schleife.

Was Sie geschrieben haben:

for line in self.twistedTcpClient.readLines():
    process_line(line) ...

ist problematisch, da Twisted asynchron ist.Es gibt für Twisted keine Möglichkeit, während des Wartens etwas anderes zu tun twistedTcpClient.readLines() Methode.

Ich schlage vor, ein Protokoll zu schreiben, aber wenn Sie wirklich auf diesem Iteratormuster bestehen, können Sie möglicherweise Folgendes tun:

@inlineCallbacks
def my_func():
    while True:
        try:
            line = yield self.twistedTcpClient.getNextLine()
        except StopIteration:
            break

        process_line(line) ...

Nun ist es schwierig, es zuzubereiten twistedTcpClient zurückkehren Deferreds für jeden Aufruf von getNextLine().Vielleicht so etwas:

class MyProtocol(LineReceiver):
    ...
    def getNextLine(self):
        self.defer_given_out = Deferred()

    def lineReceived(self, line):
        self.defer_given_out.callback(line)

    def connectionLost(self):
        self.defer_given_out.errback(StopIteration())

(Dies ist nur ein Beispiel, das die Idee veranschaulicht. Sie müssten es erweitern, um die Details zu berücksichtigen.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top