2016-02-26 3 views
5

Ich habe 2 Codebasen, eine in Python, eine in C++. Ich möchte Echtzeitdaten zwischen ihnen teilen. Ich versuche, welche Option am besten für meine speziellen Anwendungsfall funktionieren zu bewerten:Teilen von Informationen zwischen einem Python-Code und C++ - Code (IPC)

  • viele kleine Datenaktualisierungen aus dem C++ Programm in die Python-Programm
  • sie laufen beide auf der gleichen Maschine
  • Zuverlässigkeit ist wichtig,
  • niedrige Latenz ist schön

ich ein paar Optionen sehen haben:

  • Ein Prozess schreibt in eine flache Datei, der andere Prozess liest ihn. Es ist nicht skalierbar, langsam und I/O fehleranfällig.
  • Ein Prozess schreibt in eine Datenbank, der andere Prozess liest ihn. Dies macht es skalierbarer, etwas weniger fehleranfällig, aber immer noch sehr langsam.
  • Betten Sie mein Python-Programm in die C++ ein oder umgekehrt. Ich habe diese Lösung abgelehnt, weil beide Codebasen ziemlich komplex sind, und ich habe es aus Gründen der Wartungsfreundlichkeit bevorzugt, sie getrennt zu halten.
  • Ich benutze einige Sockets in beiden Programmen und sende Nachrichten direkt. Dies scheint ein vernünftiger Ansatz zu sein, macht sich aber nicht die Tatsache zunutze, dass sie sich auf demselben Rechner befinden (er wird leicht optimiert, indem ein lokaler Host als Ziel verwendet wird, fühlt sich aber immer noch schwerfällig an).
  • Verwenden Sie den gemeinsamen Speicher. Bisher denke ich, dass dies die befriedigendste Lösung ist, die ich gefunden habe, aber den Nachteil hat, dass sie etwas komplexer zu implementieren ist.

Gibt es andere Lösungen, die ich berücksichtigen sollte?

+0

Direkte Verwendung von Python/C++ - Code aus C++/Python? –

+0

RESTful API sollte Ihnen am meisten helfen, Eine perfekte Sprache unabhängig api – AlokThakur

+0

@Revolver_Ocelot, ich besitze die 2 Code-Basen, also ja ich kann Code direkt in jedem verwenden. – DevShark

Antwort

1

Zunächst ist diese Frage in hohem Maße auf der Meinung basiert!

Der sauberste Weg wäre, sie im selben Prozess zu verwenden und sie direkt kommunizieren zu lassen. Die einzige Komplexität besteht darin, richtige API- und C++ -> Python-Aufrufe zu implementieren. Nachteile sind die Wartbarkeit, die Sie feststellen, und potentiell die Robustheit (beides stürzt zusammen, in den meisten Fällen kein Problem) und geringere Flexibilität (sind Sie sicher, dass Sie sie nie auf verschiedenen Rechnern ausführen müssen)? Erweiterbarkeit ist das Beste, da es sehr einfach ist, mehr Kommunikation hinzuzufügen oder bestehende zu ändern. Sie können den Wartungspunkt überdenken. Können Sie Python App ohne C++ - Gegenstück verwendet werden? Wenn nicht, würde ich mich nicht so sehr um Wartbarkeit sorgen.

Dann Shared Memory ist die nächste Wahl mit besserer Wartbarkeit, aber dieselben anderen Nachteile. Die Erweiterbarkeit ist ein bisschen schlechter, aber immer noch nicht so schlimm. Es kann kompliziert sein, ich weiß nicht, Python-Unterstützung für Shared Memory-Betrieb, für C++ können Sie einen Blick auf Boost.Interprocess. Die Hauptfrage, die ich zuerst prüfen würde, ist die Synchronisation zwischen Prozessen.

Dann Netzwerkkommunikation. Hier gibt es viele Möglichkeiten, vom einfachsten binären Protokoll, das auf Socket-Ebene implementiert wurde, bis zu den in Kommentaren erwähnten Optionen auf höherer Ebene. Es hängt davon ab, wie komplex Ihre C++ < -> Python-Kommunikation ist und in Zukunft sein kann. Dieser Ansatz kann komplizierter implementiert werden, kann Bibliotheken von Drittanbietern erfordern, ist aber einmal erweiterbar und flexibel. Normalerweise basieren Bibliotheken von Drittanbietern auf Code-Generierung (Thrift, Protobuf), die Ihren Build-Prozess nicht vereinfacht.

Ich würde nicht ernsthaft in Erwägung ziehen, Dateisystem oder Datenbank für diesen Fall.

+0

Was ist "richtige API" in diesem Fall? Ich verstehe es nicht. Sie sind separate Apps. – Andrey

+0

Ich meine eine API, die Sie von C++ Seite aufrufen möchten, es kann sein, was Sie brauchen, aber besser, es an einem einzigen Ort zu halten, so etwas wie Fassadenmuster (https://en.wikipedia.org/wiki/ Facade_pattern), für die schmerzfreie Wartung. Eine solche API wäre in Ordnung, egal welche Optionen Sie wählen. –

Verwandte Themen