質問
次のような考えられる IPC メカニズムに関する提案を探しています。
- クロスプラットフォーム (少なくとも Win32 と Linux)
- 実装が簡単 C++ 同様に 最も一般的なスクリプト言語 (Perl、Ruby、Python など)。
- ついに、 使い方が簡単 プログラミングの観点から!
私の選択肢は何ですか?私は Linux でプログラミングをしていますが、将来的には自分が書いたものを他の OS に移植できるようにしたいと考えています。ソケット、名前付きパイプ、または DBus のようなものを使用することを考えました。
解決
速度の観点から見ると、最も優れたクロスプラットフォーム IPC メカニズムはパイプです。ただし、これは同じマシン上でクロスプラットフォーム IPC が必要であることを前提としています。リモート マシン上のプロセスと通信できるようにしたい場合は、代わりにソケットの使用を検討することをお勧めします。幸いなことに、少なくとも TCP について話しているのであれば、ソケットとパイプはほぼ同じ動作をします。それらを設定および接続するための API は異なりますが、どちらもデータのストリームのように機能します。
ただし、難しいのはコミュニケーション チャネルではなく、そこを介してやり取りされるメッセージです。本当に必要なのは、検証と解析を実行してくれるものです。Google で見ることをお勧めします プロトコルバッファ. 。基本的には、プロセス間で渡したいオブジェクトを記述する仕様ファイルを作成します。仕様に一致するオブジェクトを読み書きするためのコードをさまざまな言語で生成するコンパイラがあります。メッセージング プロトコルとパーサーを自分で考え出すよりもはるかに簡単です (バグが発生しにくくなります)。
他のヒント
C++ については、こちらをご覧ください。 IPCをブーストする.
おそらく、スクリプト言語のバインディングを作成または検索することもできます。
それ以外の場合、スクリプト言語とインターフェイスできることが本当に重要な場合、最善の策は、単純にファイル、パイプ、ソケット、さらには HTTP のような高レベルの抽象化を使用することです。
なぜ D-Bus ではないのでしょうか?これは、ほぼすべてのプラットフォームで実行できる非常にシンプルなメッセージ パッシング システムであり、堅牢性を考慮して設計されています。現時点では、ほぼすべてのスクリプト言語でサポートされています。
試してみてはいかがでしょうか ヤミ 、非常にシンプルでありながら機能的で、移植可能で、いくつかの言語にバインドされています。
ポータブルで使いやすく、多言語に対応した、 LGPLedソリューション、私はあなたにお勧めします ゼロMQ:
- 驚くほど高速で、ほぼ直線的に拡張可能でありながら、シンプルです。
- 単純および複雑なシステム/アーキテクチャに適しています。
- 非常に強力な通信パターンが利用可能です:レップ-レップ、プッシュ-プル、パブ-サブ、ペア-ペア。
- スレッド間でメッセージを受け渡す場合、トランスポート プロトコルをより効率的に設定できます (
inproc://
)、プロセス (ipc://
) または機械 ({tcp|pgm|epgm}://
)、VMware 仮想マシン間で接続が実行されている場合にプロトコル オーバーヘッドの一部を削減するスマート オプションを備えています(vmci://
).
シリアル化の場合は、私が提案します メッセージパック またはプロトコルバッファー(他の人もすでに述べています)、ニーズに応じて。
どうでしょうか Facebookの倹約?
Thrift は、スケーラブルな言語を超えたサービス開発のためのソフトウェア フレームワークです。ソフトウェア スタックとコード生成エンジンを組み合わせて、C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk、OCaml の間で効率的かつシームレスに動作するサービスを構築します。
ソケットに基づいたものが必要になると思います。
単なる IPC ではなく RPC が必要な場合は、HTTP 上で実行され、任意の言語から使用できる XML-RPC/SOAP のようなものをお勧めします。
YAMI - もう一つのメッセージング インフラストラクチャ 軽量のメッセージングおよびネットワーキング フレームワークです。
を使用することをお勧めします。 プリブシス Cライブラリ。非常にシンプルで軽量、クロスプラットフォームです。LGPLのもとでリリースされました。それは以下を提供します:
- 名前付きシステム全体の共有メモリ領域 (System V、POSIX、および Windows 実装)。
- アクセス同期のための名前付きシステム全体のセマフォ (System V、POSIX、および Windows 実装)。
- 共有メモリとセマフォに基づく名前付きシステム全体の共有バッファ実装。
- IPv4 および IPv6 をサポートするソケット (TCP、UDP、SCTP) (UNIX および Windows 実装)。
非常に優れたドキュメントを備えた使いやすいライブラリです。C で記述されているため、スクリプト言語から簡単にバインディングを作成できます。
プロセス間で大規模なデータ セットを渡す必要がある場合 (特に速度が重要な場合)、共有メモリを使用してデータ自体を渡し、ソケットを使用してデータの準備ができたことをプロセスに通知することをお勧めします。次のように作ることができます。
- プロセスはデータを共有メモリセグメントに置き、ソケット経由で別のプロセスに通知を送信します。通常、通知は非常に小さいため、時間のオーバーヘッドは最小限になります。
- 別のプロセスが通知を受け取り、共有メモリ セグメントからデータを読み取ります。その後、データが最初のプロセスに読み戻されたという通知を送信して、さらに多くのデータをフィードできるようにします。
このアプローチは、クロスプラットフォーム方式で実装できます。
分散コンピューティングは通常複雑なので、車輪の再発明ではなく、既存のライブラリまたはフレームワークを使用することを強くお勧めします。以前の投稿者では、これらのライブラリとフレームワークをいくつか列挙しました。ニーズに応じて、非常に低レベルのフレームワーク (ソケットなど) または高レベルのフレームワーク (CORBA など) を選択できます。「これを使用する」という一般的な答えはあり得ません。分散プログラミングについて学ぶ必要があります。そうすれば、その仕事に適したライブラリやフレームワークを選択するのがずっと簡単になるでしょう。
ACE および CORBA ORB TAO (ACE に基づいて構築された) と呼ばれる分散コンピューティング用の C++ フレームワークが広く使用されています。ACE に関する非常に良い本があります http://www.cs.wustl.edu/~schmidt/ACE/ それで見てみるといいかもしれません。気をつけて!
パイプを使用することほど簡単なことはありません。パイプは私が知っているすべての OS でサポートされており、ほぼすべての言語でアクセスできます。
チェックアウト これ チュートリアル。
ローカルホスト FTW への TCP ソケット。
Python には非常に優れた IPC ライブラリがあります。見る https://docs.python.org/2/library/ipc.html
Xojo には、クロスプラットフォーム IPC サポートが組み込まれています。 IPCSocketクラス. 。明らかに他の言語で「実装」することはできませんが、Xojo コンソール アプリで使用し、他の言語から呼び出すことができるため、このオプションはおそらく非常に簡単になります。
コードの保守とデバッグを簡単にしたい場合、Google protobufs は本当に悪いアイデアです。人々がそれを悪用し、コードを汚染するために使用するのは非常に簡単です。proto ファイルは優れていますが、基本的には構造ヘッダー ファイルと同じもので、生成されるコードは完全にクソで、本当にソフトウェア プロジェクトを自動化する代わりに妨害するための秘密攻撃ツールなのかと疑ってしまいます。しばらく使用すると、コードからそれを削除することはほとんど不可能になります。デバッグが容易な修正フォーマット構造のヘッダー ファイルを使用することをお勧めします。
本当に圧縮が必要な場合は、ファイル構造のアドレス/データ マッピングにリモートで切り替えてください...その場合、パケットは単なるアドレスとデータのペアの束です...また、人間が読みやすくデバッグ可能なコードを生成する独自の Perl スクリプトを使用して自動化するのが非常に簡単な構造です。