2013-05-28 20 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++デーモンから分離するのは良いでしょう)。速くてください - Pythonは多くのノードに関する情報を得ることができるはずです。エンドユーザができるだけスムーズに作業できるようにします。

現在、私は考えていた:

  1. IPC(0MQのような)データのシリアル化メカニズムのいくつかの種類を持ちます。
  2. RPCはProtocol BuffersまたはThriftに基づいています。
  3. 統合Boost.Python

に基づいてIPCとRPCのソリューションは良いようだが、私はブーストを使用してに関する情報を発見した一方の点1からの機能性を得るために大きなラッパーを記述する必要があります。 PythonをC++のデーモンに入れても、それが可能かどうかはわかりません。

答えて

4
  1. Boost.Pythonはデーモンで使用できます。

  2. スリフトバッファとプロトコルバッファは正常に機能します。 Thriftは完全なRPCサーバーを実装していますが、昨年の状況が変わった場合を除き、シリアル化のみが提供されています。個人的に私はスリルフを好むだろう。そのブーストの場合の事実 -

これら二つの解決策との違いは、スピード(などTCP_NODELAY正しいソケットオプションを指定した場合、RPCは本当に遅いないがBoost.Pythonは、間違いなく高速です)です。バイナリのバイナリはPythonの特定のバージョンに依存します。 Thriftの場合、特にThrift自体がOSディストリビューションのパッケージとしてインストールされている場合は、依存性が少なくなります。とにかく、これはパフォーマンスと展開の問題です。コミュニケーションがどれほど速くなければならないのか、どこでどのようにプログラムを展開するのか分からなければ、答えられません。

UPD:デーモンをC++で書く必要がありますか?それがグラフ上で実行される重い計算のためであれば、計算部分だけがC++(拡張モジュール)になければならないのでしょうか?通常、他の手法よりも拡張が優先されます。

+0

ありがとう、C++デーモンはC++で書かれていなければなりませんが、何らかの調査の後、デーモンである必要はありません。Pythonが 'Cython'/' Boost.Python'。 C++の部分は、フードの下にあるコンパイラで、グラフをバイナリのマシンコードにコンパイルします。私は解決策を見つけたと思う - Pythonをデーモンにすることは、Cythonを使っている私のC++ライブラリからいくつかの関数を呼び出すデーモンは非常に良い解決策です。 –

+0

同意します。一般的には、Pythonで一般的な制御ロジックを実装し、PythonではC++で実装された拡張モジュールとして実行できないことを提供することが最良の選択肢です。 – Ellioh

1

私はCythonをお勧めします。それは非常にまともなC++ integrationを持っています。これはC++を使用する自由度が非常に少なく、つまり定型化はほとんどありません。 C++の例外はPythonの例外になります。それでも、多くのことを微調整することができます。あなたはそれを試してみるべきです。