Was ist der beste Weg, um Daten von Python zu einer anderen Anwendung in Windows zu übertragen?

8

Ich entwickle eine Anwendung mit einem Team in .Net (C ++) und stelle eine COM-Schnittstelle zur Verfügung, um mit Python und anderen Sprachen zu interagieren.

Was wir herausgefunden haben, ist, dass das Schieben von Daten durch COM ziemlich langsam ist.

Ich habe mehrere Alternativen in Betracht gezogen:

  • Dumping von Daten in eine Datei und Senden des Dateipfads über com
  • Shared Memory über mmap ?
  • Daten direkt über einen Socket streamen?

Wie können Sie aus Ihrer Erfahrung Daten weitergeben?

    
monkut 13.11.2008, 09:25
quelle

4 Antworten

9

Da wir innerhalb der Windows-Interprozesskommunikationsmechanismen geblieben sind, hatten wir positive Erfahrung mit Windows-Named Pipes . Verwenden Sie Windows überlappende IO und das Modul win32pipe von pywin32 .

Sie können viel über win32 und python im Python Programming On Win32 Buch erfahren.

Der sendende Teil schreibt einfach in r'\.\pipe\mypipe' .

Ein Listener-Objekt ( ovpipe ) enthält eine Ereigniskennung, und das Warten auf eine Nachricht mit möglichen anderen Ereignissen beinhaltet den Aufruf von win32event.WaitForMultipleObjects .

%Vor%

Hier ist ein Teil der überlappenden Python-Listener-Klasse:

%Vor%     
gimel 13.11.2008, 10:20
quelle
2

XML / JSON und entweder ein Web Service oder direkt über einen Socket. Es ist auch sprach- und plattformunabhängig. Wenn Sie also entscheiden, ob Sie den Python-Teil unter UNIX hosten möchten, oder wenn Sie plötzlich Java oder PHP oder so ziemlich jede andere Sprache verwenden möchten, können Sie das tun.

In der Regel bieten proprietäre Protokolle / Architekturen wie COM mehr Einschränkungen als Vorteile. Aus diesem Grund erschienen die offenen Spezifikationen an erster Stelle.

HTH

    
Simon 13.11.2008 09:50
quelle
2

+1 auf die Named Pipes, aber ich möchte auch hinzufügen, dass aus Ihren Kommentaren scheint, dass Ihre Anwendung sehr gesprächig ist. Jedes Mal, wenn Sie einen Remote-Aufruf durchführen, unabhängig davon, wie schnell der zugrunde liegende Transport ist, haben Sie feste Kosten für das Marshalling der Daten und die Herstellung einer Verbindung. Wenn Sie die Addpoint-Methode (lat, long) in eine addpoints (point_array) -Methode ändern, können Sie eine Menge Overhead sparen. Die Idee ist ähnlich, warum wir Datenbankverbindungspools und http-Keep-Alive-Verbindungen haben. Je weniger Sie anrufen, desto besser. Ihre vorhandene COM-Lösung kann sogar gut genug sein, wenn Sie nur die Anzahl der Anrufe begrenzen können, die Sie darüber führen.

    
Sam Corder 13.11.2008 18:18
quelle
0

Es sollte nicht zu kompliziert sein, einen Test für jede Ihrer Alternativen zu erstellen und einen Benchmark zu erstellen. Beachten schlägt kontextsensitive empirische Daten ...:)

Oh, und wenn Sie das tun, bin ich sicher, dass viele Leute an den Ergebnissen interessiert wären.

    
Toni Ruža 13.11.2008 09:50
quelle

Tags und Links