web-dev-qa-db-ja.com

C ++とIPCの間の単純なPython(クロスプラットフォーム)

同じボックスで実行されているPythonプロセスがピックアップする必要がある「イベント」をまれに生成するバックグラウンドで実行されているC++プロセスがあります。

  • C側のコードは、できるだけ軽量である必要があります。
  • Python側は読み取り専用です。
  • 実装はクロスプラットフォームでなければなりません。
  • 送信されるデータは非常に単純です。

私のオプションは何ですか?

ありがとう

37
Lee Treveil

zeromq -ほかには何もありません。メッセージを文字列としてエンコードします。

ただし、ライブラリからシリアライゼーションを取得する場合は protobuf を使用すると、PythonおよびC++のクラスが生成されます。SerializeToString()およびParseFromString()関数をどちらかの終わり、それからZeroMqを介して文字列をパイプします。

他の解決策の方が速いとは思えないので問題は解決しました。また、他の解決策は配線が簡単で理解も簡単ではありません。

Windowsの名前付きパイプやUNIXのUnixドメインソケットなど、rpcに特定のシステムプリミティブを使用する場合は、 Boost :: ASIO を確認する必要があります。ただし、(a)ネットワーキングの背景がなく、(b)C++を十分に理解していない限り、これは非常に時間がかかります

49
Hassan Syed

Googleの protobuf は、プログラム間のRPCに最適なライブラリです。 Python および C++ のバインディングを生成します。

分散メッセージングシステムが必要な場合は、 RabbitMQzeromq 、または ActiveMQ などを使用することもできます。メッセージキューライブラリの説明については、 この質問 を参照してください。

5
jterrace

zeromq を使用します。これは、取得するのと同じくらい簡単です。

5
zeekay

別のオプションは、2つのプログラムを個別に実行するのではなく、 ctypes モジュールを使用してPythonコードからCコードを呼び出すだけです。

2
mgalgs

データはどのくらい複雑ですか?それが単純であれば、文字列としてシリアル化します。適度に複雑な場合は、JSONを使用します。 TCPは優れたクロスプラットフォームですIPCトランスポート。これはIPCがまれであると言うので、パフォーマンスは非常に重要です。TCP+ JSONで十分です。

1
Spike Gronim

Google [〜#〜] grpc [〜#〜] を使用できます

0
KindDragon