2013-05-28 92 views
5

我想用C++編寫一個守護進程,它將保存一個圖數據結構並計算一些依賴關係。我還想要Python Batch(也是一個守護進程 - 基於HTML的GUI的後端),它允許用戶在這些C++結構上進行交互操作 - 添加/刪除/連接/ ...節點並讀取計算結果。Python <-> C++面向對象通信

我很想選擇最好的通訊機制。

的強制性功能:

  1. Python和C++應該能夠在面向對象方法的節點進行操作,所以像n1 = node('a'); n2 = n1.add_subnode('b'); n2.ports('test').connect(node('c'))
  2. Python的批次不我希望能夠編寫代碼必須與C++守護進程「分離」 - 它們可以具有相同的生命週期(但在C++崩潰或錯誤情況下以某種方式將批處理與C++守護進程分開是很好的 - 這種分離是可選的)
  3. 通信應該要快 - Python應該能夠獲得大量節點和信息讓最終用戶儘可能順利地工作。用某種數據序列化機制

    1. IPC(如0MQ):

    目前,我在想什麼。

  4. RPC基於Protocol BuffersThrift
  5. 集成基於Boost.Python

的IPC和RPC的解決方案似乎不錯,但我必須寫一個大包裝,以獲得從點1的功能在另一方面,我沒有發現任何有關使用升壓信息。 Python中的C++守護進程,我不知道它是否可能。

回答

4
  1. Boost.Python可以在守護進程中使用。

  2. 節儉和協議緩衝工作正常。 Thrift在protobuf的同時實現了一個完整的RPC服務器,除非去年的情況發生了變化,只是提供序列化。我個人更喜歡節儉。

這兩種解決方案之間的差異是速度(Boost.Python的絕對是速度更快,如果你指定了正確的套接字選項雖然RPC是不是真的慢 - TCP_NODELAY等),而事實上,在加速的情況下。 Python你的二進制文件取決於某個版本的Python。對於Thrift,您的依賴關係較少,特別是如果Thrift本身作爲您的操作系統發行版的軟件包進行安裝。無論如何,這是一個性能和部署問題。如果不知道通訊應該多快,以及您將在何處以及如何部署您的程序,則無法回答。

UPD:你真的需要用C++編寫守護進程嗎?如果這是因爲在圖上執行大量計算,可能只有計算部分應該在C++(擴展模塊)中?擴展通常比其他技術更受歡迎。

+0

謝謝C++守護在C++,但經過一番調查我碰到一個想法來寫的,它並沒有成爲守護 - 它可以寫成一組使用'Cython'由Python中的庫/' Boost.Python'。 C++部分是一個編譯器,它將圖形編譯爲一些二進制機器代碼。我想我找到了解決辦法 - 讓Python的這將調用一些功能使用'Cython'是很好的解決方案我的C++庫守護進程。 –

+0

同意。通常它是最好的可能的選擇:實現一般控制邏輯在Python和提供的東西不能在Python進行如在C++實現的擴展模塊。 – Ellioh

1

我會推薦Cython。它有非常體面C++ integration。它給你很大的自由來使用C++,而且幾乎沒有任何模板。 C++異常成爲Python異常。不過,你可以微調很多東西。你應該嘗試一下。