Was ist der richtige / beste Weg, Objekte wie Listen oder Dicts über Zeromq in Python zu senden? Was ist, wenn wir ein PUB / SUB-Muster verwenden, bei dem der erste Teil der Zeichenfolge als Filter verwendet wird?
Manuelle Serialisierung
Sie verwandeln die Daten in eine Zeichenkette, verketten oder machen Sie Ihre Sachen. Es ist schnell und benötigt nicht viel Platz, erfordert aber Arbeit und Wartung und ist nicht flexibel.
Wenn eine andere Sprache die Daten lesen möchte, müssen Sie sie erneut codieren. Kein TROCKEN.
Ok für sehr kleine Daten, aber wirklich ist die Menge an Arbeit in der Regel nicht wert, es sei denn, Sie suchen nach Geschwindigkeit und Speichereffizienz und Sie können messen, dass Ihre Implementierung wesentlich besser ist.
Gurke
Langsam, aber Sie können komplexe Objekte serialisieren und sogar abfragen. Es ist mächtig, und es ist so einfach, es ist ein Kinderspiel.
Auf der anderen Seite ist es möglich, mit etwas zu enden, das Sie nicht pürieren und Ihren Code brechen können. Außerdem können Sie die Daten nicht mit anderen Bibliotheken teilen, die in einer anderen Sprache geschrieben sind.
Schließlich ist das Format nicht für Menschen lesbar (schwer zu debuggen) und ziemlich ausführlich.
Sehr schön, um Objekte und Aufgaben zu teilen, nicht so schön für Nachrichten.
json
Relativ schnell, einfach zu implementieren mit einfachen bis durchschnittlich komplexen Datenstrukturen. Es ist flexibel, menschlich lesbar und Daten können leicht über mehrere Sprachen hinweg geteilt werden.
Für komplexe Daten müssen Sie ein wenig Code schreiben.
Wenn Sie nicht einen ganz bestimmten Bedarf haben, ist dies wahrscheinlich die beste Balance zwischen Funktionen und Komplexität. Vor allem seit der letzten Implementierung in Python ist die lib in C und die Geschwindigkeit ist in Ordnung.
xml
Ausführlich, schwer zu erstellen und ein zu behebender Schmerz, es sei denn, Sie haben eine schwere Bibliothek, die Ihnen die ganze Arbeit abnimmt. Langsam.
Wenn es keine Voraussetzung ist, würde ich es vermeiden.
Am Ende
Wie jetzt ist Geschwindigkeit und Platzeffizienz relativ, und Sie müssen zuerst die Fragen beantworten:
Es ist alles was zählt.
Dieser wunderbare Moment der Philosophie ist vergangen, benutze JSON.
Kodieren Sie vor dem Senden als JSON und dekodieren Sie nach dem Empfang als JSON.
In zeroMQ ist eine Nachricht einfach ein binärer Blob. Sie können alles hineinlegen, was Sie wollen. Wenn Sie ein Objekt mit mehreren Teilen haben, müssen Sie es zunächst in etwas serialisieren, das am anderen Ende deserialisiert werden kann. Der einfachste Weg dazu ist die Verwendung von obj.repr (), die eine Zeichenfolge erzeugt, die Sie am anderen Ende ausführen können, um das Objekt neu zu erstellen. Aber das ist nicht der beste Weg.
Zunächst sollten Sie versuchen, ein sprachunabhängiges Format zu verwenden, da Sie früher oder später mit Anwendungen interagieren müssen, die in anderen Sprachen geschrieben sind. Ein JSON-Objekt ist eine gute Wahl, da es sich um eine einzelne Zeichenfolge handelt, die von vielen Sprachen entschlüsselt werden kann. Ein JSON-Objekt ist jedoch möglicherweise nicht die effizienteste Darstellung, wenn Sie viele Nachrichten über das Netzwerk senden. Stattdessen sollten Sie ein Format wie MSGPACK oder Protobufs in Betracht ziehen.
Wenn Sie ein Thema identifier für PUB_SUB benötigen, dann kleben Sie es einfach an den Anfang. Verwenden Sie entweder ein Thema mit fester Länge oder platzieren Sie ein Trennzeichen zwischen dem Thema und der echten Nachricht.
Wenn Sie Beispiele sehen möchten, habe ich ein kleines Paket namens pyRpc veröffentlicht, das Ihnen zeigt, wie Sie eine einfache Python-RPC-Installation ausführen, bei der Sie Dienste zwischen verschiedenen Apps bereitstellen. Es verwendet die integrierte Methode python zeromq zum Senden und Empfangen von Python-Objekten (was ich glaube, ist einfach cPickle)
Während meine Beispiele die pyobj-Version der Sende- und Empfangsaufrufe verwenden, können Sie sehen, dass andere Versionen verfügbar sind, die Sie verwenden können, wie send_json, send_unicode ... Wenn Sie nicht eine bestimmte Art der Serialisierung benötigen, können Sie einfach Verwenden Sie die bequemen Sende- / Empfangsfunktionen, die die Serialisierung / Deserialisierung an beiden Enden für Sie übernehmen.
json ist wahrscheinlich der schnellste und wenn Sie noch schneller als in zeromq benötigt werden, können Sie cjson manuell verwenden. Wenn Sie sich auf Geschwindigkeit konzentrieren, ist dies eine gute Option. Aber wenn Sie wissen, dass Sie nur mit anderen Python-Diensten kommunizieren werden, ist der Vorteil von cPickle ein natives Python-Serialisierungsformat, das Ihnen viel Kontrolle bietet. Sie können Ihre Klassen einfach so definieren, dass sie die gewünschte Art serialisieren und am Ende mit nativen Python-Objekten enden, im Gegensatz zu grundlegenden Werten. Ich bin sicher, Sie könnten auch Ihren eigenen Objekt-Hook für Json schreiben, wenn Sie wollten.