listet oder diktiert über zeromq in Python

8

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?

  • Ich bin mir bewusst, dass es mehrteilige Nachrichten gibt, die aber ursprünglich für einen anderen Zweck gedacht waren. Außerdem können Sie nicht alle Nachrichten abonnieren, die eine bestimmte Zeichenfolge als erstes Element haben.
Davoud Taghawi-Nejad 25.02.2012, 15:35
quelle

6 Antworten

15

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:

  • welche Effizienz brauche ich?
  • was kann ich dafür bezahlen (Geld, Zeit, Energie)?
  • Welche Lösung passt in mein aktuelles System?

Es ist alles was zählt.

Dieser wunderbare Moment der Philosophie ist vergangen, benutze JSON.

    
e-satis 25.02.2012, 16:45
quelle
6

Kodieren Sie vor dem Senden als JSON und dekodieren Sie nach dem Empfang als JSON.

    
Ignacio Vazquez-Abrams 25.02.2012 15:37
quelle
6

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.

    
Michael Dillon 25.02.2012 16:29
quelle
4

Überprüfen Sie auch MessagePack

Ссылка

"Es ist wie JSON. Aber schnell und klein"

    
george.erickson 01.02.2013 23:11
quelle
2

JSON:

%Vor% %Vor%

Weitere Informationen:

Ignacio Pérez 02.09.2014 08:59
quelle
1

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.

    
jdi 25.02.2012 16:54
quelle

Tags und Links