2016-02-26 20 views
5

Ho due basi di codice, una in python, una in C++. Voglio condividere i dati in tempo reale tra di loro. Sto cercando di valutare quale opzione funziona meglio per il mio specifico caso d'uso:Condivisione di informazioni tra un codice python e un codice C++ (IPC)

  • molti aggiornamenti dei dati di piccole dimensioni dal programma C++ al programma pitone
  • entrambi corsa sulla stessa macchina
  • l'affidabilità è importante
  • bassa latenza è bello avere

posso vedere alcune opzioni:

  • Un processo scrive su un file flat, l'altro processo lo legge. Non è scalabile, lento e soggetto a errori di I/O.
  • Un processo scrive su un database, l'altro processo lo legge. Ciò lo rende più scalabile, leggermente meno incline agli errori, ma comunque molto lento.
  • Incorpora il mio programma python in C++ o viceversa. Ho respinto questa soluzione perché entrambe le basi di codice sono ragionevolmente complesse e ho preferito mantenerle separate per motivi di manutenibilità.
  • Io uso alcuni socket in entrambi i programmi e invio messaggi direttamente. Questo sembra essere un approccio ragionevole, ma non fa leva sul fatto che si trovano sulla stessa macchina (sarà leggermente ottimizzato usando l'host locale come destinazione, ma si sente ancora ingombrante).
  • Utilizzare la memoria condivisa. Finora penso che questa sia la soluzione più soddisfacente che ho trovato, ma ha lo svantaggio di essere leggermente più complessa da implementare.

Ci sono altre soluzioni che dovrei considerare?

+0

Utilizzare direttamente codice Python/C++ da C++/Python? –

+0

L'API RESTful dovrebbe aiutarti di più, una perfetta lingua indipendente api – AlokThakur

+0

@Revolver_Ocelot, possiedo le 2 basi di codice, quindi sì, posso usare il codice direttamente in ciascuna. – DevShark

risposta

1

Prima di tutto, questa domanda è altamente basata sull'opinione pubblica!

Il modo più semplice sarebbe usarli nello stesso processo e farli comunicare direttamente. L'unica complessità consiste nell'implementare le giuste chiamate API e C++ -> Python. Gli svantaggi sono la manutenibilità, come notato, e potenzialmente una minore robustezza (entrambi bloccati insieme, non un problema nella maggior parte dei casi) e una minore flessibilità (sei sicuro di non doverli mai eseguire su macchine diverse?). L'estensibilità è la migliore in quanto è molto semplice aggiungere più comunicazioni o modificare esistenti. Puoi riconsiderare il punto di manutenibilità. Si può usare l'app Python senza la controparte C++? Altrimenti non mi preoccuperei tanto della manutenibilità.

Quindi la memoria condivisa è la scelta successiva con una migliore manutenibilità ma gli stessi altri inconvenienti. L'estensibilità è un po 'peggiore, ma non così male. Può essere complicato, non conosco il supporto Python per l'operazione di memoria condivisa, per C++ puoi dare un'occhiata a Boost.Interprocess. La domanda principale che controllerei prima è la sincronizzazione tra i processi.

Quindi, comunicazione di rete. Un sacco di scelte qui, dal più semplice protocollo binario implementato a livello di socket a opzioni di livello superiore menzionate nei commenti. Dipende da quanto sia complessa la tua comunicazione C++ < -> Python in futuro. Questo approccio può essere più complicato da implementare, può richiedere librerie di terze parti, ma una volta eseguito è estensibile e flessibile. Solitamente le librerie di terze parti si basano sulla generazione del codice (Thrift, Protobuf) che non semplifica il processo di compilazione.

Non considererei seriamente il file system o il database per questo caso.

+0

Che cosa significa "API corretta" in questo caso? Non capisco Sono app separate. – Andrey

+0

Intendo un'API che vorresti chiamare dal lato C++, può essere qualsiasi cosa ti serva, ma meglio tenerla in un unico posto, qualcosa come il modello di facciata (https://en.wikipedia.org/wiki/ Facade_pattern), per manutenzione indolore. Un'API di questo tipo andrebbe bene per qualsiasi opzione scegliate. –

Problemi correlati