2010-12-03 15 views
2

私はいくつかのアプリケーション(すべてC#、C++、Pythonなどの異なる言語で書かれています)をリンクしています。異なる言語で書かれたアプリケーション間の通信

リンクとはどういう意味ですか?私が取り組んでいるシステムは、それぞれ特定の処理タスクを担当する小さなプログラムで構成されています。データセットをあるアプリケーションから別のアプリケーションに簡単に転送できるようにする必要があります(問題のデータセットはおそらく数メガバイトではありません)。また、操作の現在の状態を制御するための何らかの方法が必要です

これはソケットのように見えるかもしれないし、SOAPが普遍的な解決策になるかもしれないが、人々がこのテーマについてどのように考えるかについていくつかの意見を得たいと思った。

コメント/ご感謝いただきありがとうございます!

答えて

2

私は個人的にはØMQの方が好きです。これは、メッセージを渡すための使い慣れたBSDソケット様のインターフェースを持つライブラリですが、タスクの配布に興味深いパターンを実装しています。

パイプラインに複数のプロセスを配置したいと思うようです。 ØMQを使用すると、プッシュポーリングソケットとポーリングソケットを使用して行うことができます。 (そして、後で少しの労力で複数のプロセスやマシンにスケールアップすることも可能です)。開始するにはguideを、具体的にはプッシュ&プルの動作についてはzmq_socket(3)のマンページを参照してください。

あなたが言及しているすべての言語に対応しています。

メッセージの内容に関しては、ØMQはそれ自体に関係なく、生データの単なるブロックです。 JSONやProtocol Buffersなど、あなたに合ったフォーマットを使用できます。

あなたが言及している「制御状態」はわかりません。途中で仕事をキャンセルするなど、興味がありますか?

+0

提案をありがとう、これは非常に興味深いです!パイプライニングは本質的に私がやっていることですが、データを複数のサブアプリケーションに分けて処理しなければならないので、次の段階に進む前に処理が完了するまで待つ必要があります。 。 (ほぼ別のプロセスでデータを実行することによってほぼ擬似並列性に似ています) – Hamza

+0

各サブアプリケーションは、タスクを次のステージにプッシュする責任があります。パイプライン全体の完了を知らせる1つの方法は、pub-subソケットを使用することです。チェーンの最後のサブアプリケーションに何らかの通知を発行します。 (たとえば、複数のプロセスがプッシュソケットを使用してジョブをパイプラインの先頭に送信し、それぞれが完了通知に加入してジョブのIDが来るのを待つことがあります)。これはmongrel2がそれを行う方法です。参照してください:http://www.igvita.com/2010/09/03/zeromq-modern-fast-networking-stack/ –

+0

これは私が達成しようとしているものと非常によく似ています。並べ替えられました。あなたの提案に対する多くの感謝! – Hamza

1

C#からC#の場合は、Windows Communication Foundationを使用できます。あなたはPythonとC++でもそれを使うことができます。

名前付きパイプをチェックアウトすることもできます。

+0

WCFは興味深いようですが、私がサポートしていない他の言語を統合する必要があるかもしれません。提案していただきありがとうございます。 – Hamza

0

私は、すべてのアプリケーションが見ているデータを集中管理することで問題を解決するモデルに移行すると思います。話すために「真実の一つの源」を保つ。

+0

残念ながら、それは私のコントロール外のものです、私は単一言語のアプローチは、私の人生をはるかに簡単になるだろうことに同意します:) – Hamza

+0

単数の言語、単数のデータだけである必要はありません。 –

0

ほとんどの外部ソフトウェアは、シンボルに使用するネームマングリングアルゴリズムのため、C++コードとのリンクに問題があります。そのため、他の言語で書かれたプログラムとのインタフェースをとる場合は、extern "C"extern "C" {ブロックのようなものにラッパーを宣言することが最善の方法です。

+0

頭のおかげで、私はこれを念頭に置いておくよ:) – Hamza

0

私は、ファイルシステムを使用し

(質問に設定されたデータは、おそらく数メガバイト、巨大ではありません)簡単に別のアプリケーションからデータセットを転送できるようにする必要があります。

と私はまた、ファイルシステムを使用し、再度操作

の現在の状態を制御する方法のいくつかのフォームを必要とします。JSONシリアライズされたオブジェクトを持つ "current_state.json"ファイルは、複数の言語が動作するのに最適です。

これはソケットのように見えますが、SOAPは普遍的な解決策になるでしょう。

おそらく。しかし、それはこの種のものには残酷です。あなたのOSにはすでに必要なすべての機能が備わっています。ファイルシステムを使用するだけです。非常にシンプルで信頼性の高いものです。

+0

提案のおかげで、私は確かにファイルシステムのアプローチを考えましたが、おそらく構造化されたプロトコル(SOAPのようなもの)を使用すると、データと制御メッセージを結合するのがより簡単になるだろうと考えました。 – Hamza

+0

"easy"?どうして?ファイルシステムよりも "どこが簡単か"という質問にいくつかの例を挙げてください。私は、通常のディレクトリの普通のファイルよりも単純なものに空白を描いています。おそらく私は何かを逃しています。 –

+0

私は、ファイルからの書き込み/読み込みよりも簡単なことは何もできないことに同意します。システム全体を流れるデータ/制御メッセージの一貫性のあるセットを維持することを指していました。私は、実際に問題ではないことを追跡するためにjsonファイルを保持するあなたの提案された方法を推測します。考慮すべき面白いもう一つのことは、ファイルシステムとソケットを使って実装されたこのシステムのパフォーマンスです。私は単純な比較をしなければならないかもしれません。 – Hamza

0

プロセス間通信にはさまざまな方法があります。あなたが言ったように、ソケットは普遍的な解決策かもしれません。 SOAPは、いくぶん過度のものだと思います。メールスロットを使用することもできます。私は数年前にそれを使ってC++アプリケーションを書いていました。名前付きパイプもソリューションになる可能性がありますが、Windowsでコーディングする場合は難しいかもしれません。私の意見で

  1. ソケット
  2. メールスロット

は最高の候補です。

+0

ありがとう、私は今まで私がそれを調べる前にメールスロットを聞いていないことを認めなければなりません。 – Hamza

関連する問題