Frage

Ich versuche, einen neuen Transport Twisted hinzuzufügen, die Daten aus einem Stream gelesen wird - entweder eine Datei in einer tail -f Art und Weise, oder aus einem Rohr, aber ich habe einige Probleme mit Twisted-Architektur

.

Ich habe den Transport selbst (implementiert ITransport) bereit bekam - es kümmert sich um alle Datei zu öffnen. Ich habe Streaming-Funktionen bekommt / deferreds bereit. Wie kann ich es jetzt zusammen setzen? Ich mag die neuen Daten zurück, um einige Protokolle des dataReceived() melden.

Ich könnte natürlich ein neues Objekt erstellen, die den E / A-Monitore mit dem richtigen Rückrufen einrichten möchte, soll einen Rückruf auf Reaktor registrieren heruntergefahren (um die Dateien / Protokolle zu schließen) und alles manuell starten - aber ist, dass „die richtiger Weg"? Gibt es eine schönere Abstraktion ich verwenden könnte? Ich habe reactor.connectWith() gesehen, aber es ist nicht wirklich viel von einer Abstraktion bieten ...

Auch - wie soll ich die Daten von meinem Leser auf das Protokoll zu übergeben? ITransport definiert keine Schnittstelle für sie, auch wenn es aus wie genau das Transport Verantwortung scheint.

War es hilfreich?

Lösung

Es klingt wie Sie meist gedacht haben, wie dies zu tun. Sie könnten in twisted.internet.fdesc.readFromFD interessiert sein, aber es ist nur ein paar Zeilen lang und es tut nichts besonders kompliziert (es ist ein paar Zeilen, die Sie müssen allerdings nicht halten). Abgesehen davon, dass -. Ja, haben Sie die E / A-Überwachung in diesem Fall zu tun, weil regelmäßige Filedeskriptoren nicht durch select / Umfrage / epoll unterstützt werden (sie immer als bereit gemeldet werden, nicht das, was Sie wollen)

Einige Arbeiten wurden auf die Unterstützung inotify in Verdrehte getan ( http://twistedmatrix.com/trac/ticket / 972 ), aber dies ist noch nicht abgeschlossen, so würde es jetzt nicht mehr direkt zu Ihnen nützlich sein (es sei denn, Sie es beenden helfen möchten, und verwenden Sie es dann). Angenommen, Sie sind nur zeitbasierte Abfrage verwenden, viel von dem, was in dem Reaktor ist wird nicht Ihr sich als viel zu helfen, da dieser Code auf dem mit einem System bereitgestellte Bereitschaft API (dh wählen / poll / epoll) fokussiert wird, um Ereignisse auszulösen .

Für das Rohr Fall aber sollten Sie in der Lage sein, von IReactorFDSet Methoden zu nutzen und profitieren -. addReader et al

Ihr zeitbasierte Abruf Transport kann profitieren noch ITransport von der Umsetzung - obwohl ich nicht sicher bin, wie Sie write für einen tail -f artigen Transport implementieren würden. Sie werden Ihren Transport liefern Daten über die IProtocol Schnittstelle von mit definitiv profitieren, da dieser Code-Wiederverwendung vereinfacht. IProtocol.dataReceived ist genau, wie Sie Daten, um von Ihren Leser (ich glaube, das ist das gleiche wie Ihre Transport , ist es nicht?). Dies ist nicht auf ITransport definiert, weil es eine Methode, die Sie auf einem anderen Objekt aufrufen, die nicht der Transport ist.

reactor.connectWith wahrscheinlich wird nicht Sie etwas zu kaufen. Wie Sie sagen, es ist eine Abstraktion nicht viel; Ich würde sagen, dass es eher ein Fehler ist. :)

Sie nicht zu viel Sorgen über diese Methoden nicht in der Lage, in den Reaktor direkt hinzuzufügen. Eine frei Funktion, die einen Reaktor als Parameter akzeptiert ist genauso einfach zu bedienen.

Für die Abschaltung Rückruf sollte addReader Sie tatsächlich die meisten der Weg dorthin. Jeder Leser in dem Reaktor bei Abschaltzeit wird connectionLost darauf (Teil IFileDescriptor) genannt hat. Sie sollten dies implementieren, um die Dateien zu bereinigen und Protokoll.

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