2013-05-28 16 views
5

Chcę napisać demona w C++, który będzie przechowywał strukturę danych wykresu i obliczy niektóre zależności. Chcę także mieć Pythona Batch (także demona - backend do GUI opartego na HTML), który pozwoli użytkownikom na interaktywną pracę na tych strukturach C++ - dodawaj/usuwaj/połącz/... węzły i czytaj wyniki obliczeń.Python <-> Komunikacja obiektowa C++

Chciałbym wybrać najlepszy dostępny mechanizm komunikacji.

Obowiązkowa Funkcjonalność:

  1. Python i C++ powinien być w stanie działać na węzłach obiektowego sposób, więc chciałbym, aby móc napisać kod jak n1 = node('a'); n2 = n1.add_subnode('b'); n2.ports('test').connect(node('c'))
  2. Python partia nie robi muszą być "oddzieleni" od demona C++ - mogą mieć ten sam czas życia (ale dobrze byłoby jakoś oddzielić partię od demona C++ w przypadku awarii C++ lub coś złego - ta separacja jest opcjonalna)
  3. Komunikat powinien bądź szybki - Python powinien być w stanie uzyskać informacje o wielu węzłach i umożliwić użytkownikom końcowym sprawne działanie tak dużo, jak to możliwe.

Obecnie Myślałam o:

  1. IPC (jak 0MQ) z pewnego rodzaju mechanizm serializacji danych.
  2. RPC na podstawie Protocol Buffers lub Thrift.
  3. Integracja na podstawie Boost.Python

IPC i rozwiązania RPC wydaje się dobre, ale muszę napisać wielkie owijarki, aby uzyskać funkcjonalność z punktu 1. Z drugiej strony znalazłem żadnej informacji na temat korzystania z doładowania. Python w demonie C++ i nie wiem, czy to nawet możliwe.

Odpowiedz

4
  1. Boost.Python może być używany w demonie.

  2. Blokowanie czasu i bufory protokołów działają dobrze. Thrift wdraża pełny serwer RPC, podczas gdy protobuf, chyba że sytuacja zmieniła się w zeszłym roku, oferuje tylko serializację. Osobiście wolałbym Thrift.

Różnice między tymi dwoma rozwiązaniami są szybkość (Boost.Python jest zdecydowanie szybsza, choć RPC nie jest naprawdę wolny, jeśli podasz odpowiednie opcje gniazd - TCP_NODELAY itd.) Oraz fakt, że w przypadku doładowania. Python twój plik binarny zależy od pewnej wersji Pythona. W przypadku Thrift masz mniej zależności, szczególnie jeśli Thrift jest instalowany jako pakiet dla dystrybucji OS. W każdym razie jest to kwestia wydajności i wdrożenia. Nie można na nie odpowiedzieć, nie wiedząc, jak szybka powinna być komunikacja, a także gdzie i jak zamierzasz wdrożyć swój program.

UPD: Czy naprawdę musisz napisać swojego demona w C++?Jeśli jest tak z powodu ciężkich obliczeń wykonywanych na wykresie, to może tylko część obliczeniowa powinna być w C++ (moduł rozszerzenia)? Wydłużanie jest zwykle preferowane w stosunku do innych technik.

+0

Dziękuję, demon C++ musi być napisany w C++, ale po jakimś dochodzeniu natknąłem się na pomysł, nie musi to być demon - można go zapisać jako zestaw bibliotek używanych przez Pythona za pomocą 'Cython' /' Boost.Python'. Część C++ to kompilator pod maską, który kompiluje wykres do jakiegoś binarnego kodu maszynowego. Myślę, że znalazłem rozwiązanie - sprawienie, że demon Python, który wywoływałby niektóre funkcje z moich bibliotek C++ przy użyciu 'Cython' jest bardzo dobrym rozwiązaniem. –

+0

Zgadzam się. Ogólnie jest to najlepsza możliwa opcja: implementować ogólną logikę sterującą w Pythonie i dostarczać rzeczy, których nie można wykonać w Pythonie jako moduły rozszerzeń zaimplementowane w C++. – Ellioh

1

Polecam Cython. Ma bardzo przyzwoite C++ integration. Daje ci to dużo swobody w używaniu C++ przy niewielkim wysiłku, to znaczy prawie bez podstaw. Wyjątek C++ stają się wyjątkami Python. Nadal można dostroić wiele rzeczy. Powinieneś to wypróbować.