Einfache, aber schnelle IPC-Methode für eine Python- und C ++ - Anwendung?

8

Ich habe eine GNU-Radio-Anwendung, die sowohl Python- als auch C ++ - Code verwendet. Ich möchte den C ++ Code eines Ereignisses signalisieren können. Wenn sie im selben Umfang wären, würde ich normalerweise einen einfachen booleschen Wert verwenden, aber der Code ist getrennt von dem Punkt, an dem irgendeine Form von gemeinsam genutztem Speicher benötigt wird. Der betreffende Code ist leistungskritisch, daher ist eine effiziente Methode erforderlich.

Ich habe anfangs über ein gemeinsames Speichersegment nachgedacht, auf das sowohl Python als auch C ++ zugreifen können. Daher könnte ich im Python-Code ein Flag setzen und es von C ++ aus überprüfen. Da ich nur eine einfache Flagge brauche, um den C ++ - Code anzuhalten, würde ein Semaphor ausreichen?

Um klar zu sein, muss ich eine Flagge von Python setzen und der C ++ Code wird einfach dieses Flag überprüfen, und wenn es gesetzt ist, geben Sie eine Busy-Schleife ein.

Wäre es also sinnvoll, ein gemeinsames Speichersegment zwischen Python / C ++ zu implementieren? Wie wäre es mit einem Semaphor? Unter Linux, was ist einfacher zu implementieren?

Danke!

    
Mr. Shickadance 22.04.2011, 15:11
quelle

5 Antworten

4

Wenn Sie davon ausgehen, dass es sich um zwei separate Anwendungen auf einem Rechner handelt und Sie eine anständige Echtzeitleistung benötigen, sollten Sie nicht mit Sockets arbeiten. Ich würde ein Flag im Shared Memory verwenden und wahrscheinlich ein Semaphor verwenden, um sicherzustellen, dass beide Programme nicht gleichzeitig auf das Flag zugreifen können. Diese Bibliothek bietet Zugriff auf die Semaphore und den gemeinsamen Speicher mit Python und unterstützt die Python-Versionen 2.4-3.1 (nicht 3.0): Ссылка

BEARBEITEN: Geänderte Empfehlung zur Verwendung eines Semaphors, der das Flag im Shared Memory schützt

    
Joseph Lisee 22.04.2011, 15:35
quelle
5

Warum nicht eine Unix-Buchse öffnen? Oder benutze DBus

    
Jakob Bowyer 22.04.2011 15:27
quelle
2

Wenn Boost eine Option ist, können Sie Boost.Python und Boost.Interprocess . Boost.Python gibt Ihnen einen Weg für Python & amp; C ++ - Objekte zur Interaktion und Boost.Interprocess bietet Ihnen viele Optionen für gemeinsam genutzten Speicher oder Synchronisationsprimitive über Prozessgrenzen hinweg.

    
Ferruccio 22.04.2011 15:45
quelle
1

DBus sieht vielversprechend aus. Es unterstützt Signale, so dass Sie in der Lage sein sollten, eine Anwendung bei Bedarf zu stoppen. Ich bin mir jedoch nicht sicher, ob die Leistung für Sie ausreicht.

    
Dr McKay 22.04.2011 15:25
quelle
1

Sie können versuchen, benutzerdefinierte Signale zu verwenden. Ich weiß nicht, dass Python-Code benutzerdefinierte Signale senden kann, aber Ihr C / C ++ kann sicherlich benutzerdefinierte Signale mit SIGIO definieren.

Wenn Sie strenge Anforderungen an die Antwortzeit haben, müssen Sie möglicherweise über Ihren Anwendungscode hinaus und in eine bestimmte Zeit des Betriebssystems mit Unterstützung für Echtzeitsignale (rt-linux, muOs, etc.)

schauen     
luis.espinal 22.04.2011 15:40
quelle

Tags und Links