5

グラフ データ構造を保持し、いくつかの依存関係を計算するデーモンを C++ で作成したいと考えています。また、ユーザーがこれらの C++ 構造を対話的に操作できるようにする Python Batch (デーモン - HTML ベースの GUI のバックエンド) も必要です - ノードの追加/削除/接続/... および計算結果の読み取り。

利用可能な最良の通信メカニズムを選択したいと考えています。

必須の機能は次のとおりです。

  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など)。
  2. Protocol BuffersまたはThriftに基づく RPC 。
  3. Boost.Pythonに基づく統合

IPC および RPC ソリューションは良さそうですが、ポイント 1 から機能を取得するには、大きなラッパーを作成する必要があります。一方、C++ デーモンで Boost.Python を使用することに関する情報は見つかりませんでした。可能です。

4

2 に答える 2

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

  2. Thrift と Protocol Buffers は問題なく動作します。Thrift は完全な RPC サーバーを実装しますが、protobuf は、昨年状況が変わらない限り、シリアライゼーションのみを提供します。個人的にはThriftの方が好きです。

これら 2 つのソリューションの違いは、速度 (Boost.Python の方が確実に高速ですが、正しいソケット オプション (TCP_NODELAY など) を指定すれば RPC はそれほど遅くはありません) と、Boost.Python の場合、バイナリが特定のオプションに依存するという事実です。 Python のバージョン。Thrift の場合、特に Thrift 自体が OS ディストリビューションのパッケージとしてインストールされている場合は、依存関係が少なくなります。とにかく、これはパフォーマンスと展開の問題です。通信速度と、プログラムをどこにどのように展開するかを知らなければ、答えを出すことはできません。

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

于 2013-05-28T10:55:25.630 に答える