2016-02-26 11 views
5

Mam 2 podstawy kodu, jeden w python, jeden w C++. Chcę udostępniać dane w czasie rzeczywistym między nimi. Staram się ocenić, która opcja będzie najlepsza dla mojego konkretnego przypadku użycia:Udostępnianie informacji między kodem Pythona a kodem C++ (IPC)

  • wielu małych aktualizacji danych z programu C++ do programu Pythona
  • oboje prowadzony na tej samej maszynie
  • niezawodność jest ważne
  • niskiej latencji jest miło mieć

widzę kilka możliwości:

  • Jeden proces zapisuje do pliku płaskiego, drugi proces go odczytuje. Jest nieskalowalny, powolny i podatny na błędy we/wy.
  • Jeden proces zapisuje do bazy danych, drugi proces odczytuje. Dzięki temu jest bardziej skalowalny, nieco mniej podatny na błędy, ale wciąż bardzo wolny.
  • Osadź mój program python w C++ lub na odwrót. Odrzuciłem to rozwiązanie, ponieważ obie podstawy kodu są dość skomplikowane i wolałem je oddzielać ze względu na łatwość utrzymania.
  • Używam niektórych gniazd w obu programach i wysyłam wiadomości bezpośrednio. Wydaje się, że jest to rozsądne podejście, ale nie wykorzystuje faktu, że znajdują się one na tym samym komputerze (zostanie on zoptymalizowany pod kątem użycia lokalnego hosta jako miejsca docelowego, ale nadal jest uciążliwy).
  • Użyj pamięci współdzielonej. Do tej pory uważam, że jest to najbardziej satysfakcjonujące rozwiązanie, jakie znalazłem, ale ma tę wadę, że jest nieco bardziej skomplikowane do wdrożenia.

Czy są inne rozwiązania, które powinienem wziąć pod uwagę?

+0

Bezpośrednio przy użyciu kodu Python/C++ z C++/Python? –

+0

RESTful API powinno ci pomóc, doskonały język niezależny api – AlokThakur

+0

@Revolver_Ocelot, Posiadam 2 podstawy kodu, więc tak, mogę użyć kodu bezpośrednio w każdym. – DevShark

Odpowiedz

1

Po pierwsze, to pytanie jest oparte na opiniach!

Najczystszym sposobem byłoby użycie ich w tym samym procesie i bezpośrednia komunikacja. Jedyną złożonością jest implementacja odpowiednich wywołań API i C++ -> Python. Wady to łatwość konserwacji, jak zauważyliście, i potencjalnie niższa odporność (oba awarie razem, a nie problem w większości przypadków) i mniejsza elastyczność (czy na pewno nigdy nie będziecie musieli uruchamiać ich na różnych komputerach?). Rozszerzalność jest najlepsza, ponieważ bardzo łatwo dodać więcej komunikacji lub zmienić istniejącą. Możesz ponownie rozważyć punkt łatwości konserwacji. Czy aplikacja python może być używana bez odpowiednika w C++? Jeśli nie, nie martwię się tak bardzo o łatwość konserwacji.

Następnie pamięć współdzielona jest kolejnym wyborem z lepszą konserwowalnością, ale te same wady. Rozszerzalność jest trochę gorsza, ale wciąż nie jest tak źle. Może to być skomplikowane, nie znam obsługi Pythona dla operacji z pamięcią wspólną, dla C++ można spojrzeć na Boost.Interprocess. Głównym pytaniem, które chciałbym najpierw sprawdzić, jest synchronizacja między procesami.

Następnie, komunikacja sieciowa. Mnóstwo tu opcji, od najprostszego możliwego protokołu binarnego zaimplementowanego na poziomie gniazd do opcji wyższego poziomu wspomnianych w komentarzach. Zależy od tego, jak skomplikowana jest Twoja komunikacja w języku Python i może być w przyszłości. Takie podejście może być bardziej skomplikowane w implementacji, może wymagać bibliotek zewnętrznych, ale po jego wykonaniu jest rozszerzalne i elastyczne. Zwykle biblioteki firm trzecich są oparte na generowaniu kodu (Thrift, Protobuf), co nie upraszcza procesu budowania.

Nie traktowałbym poważnie systemu plików ani bazy danych dla tego przypadku.

+0

Co to jest "właściwe API" w tym przypadku? Nie rozumiem tego. Są to osobne aplikacje. – Andrey

+0

Mam na myśli API, które chciałbyś wywołać ze strony C++, może to być wszystko, czego potrzebujesz, ale lepiej zachować je w jednym miejscu, coś w stylu fasady (https://en.wikipedia.org/wiki/ Facade_pattern), do bezbolesnej konserwacji. Takie API byłoby w porządku, bez względu na to, jakie opcje wybierzesz. –

Powiązane problemy