2011-01-31 2 views
11

私はMailboxProcessorクラスを使用して、独自のことをする別々のエージェントを保ちます。通常、エージェントは同じプロセスで互いに通信することができますが、エージェントが別々のプロセスや異なるマシン上にいるときには、エージェントが互いに話をしてもらいたいのです。どのような仕組みがそれらの間の通信を実装するのに最適ですか?いくつかの標準的な解決策はありますか?リモートのMailboxProcessors間でメッセージを渡す?

私はエージェントを実行するためにUbuntuインスタンスを使用しています。

+7

「オフトピック」と誰が投票しましたか?あなたがその質問を理解していない場合は、それを妨害しないでください。 –

+1

http://stackoverflow.com/questions/501656/f-mailbox-processor-on-distributed-systemsは、いくつかの洞察を提供するかもしれません。 –

+0

多分窓の紺碧の列を見てください。異なるマシン(彼らはそれを作業者の役割と呼ぶ)が互いに話すことを可能にするために彼らが使用するものです。あなたができることは、仕事を要求したり、仕事が完了したことを通知するために、他の人と連絡をとるエージェントを各マシンに持つことです。 – jlezard

答えて

3

私は、メッセージをシリアル化し、プロセスの境界を越えて渡し、それから相手側にディスパッチする独自のルーチンを書くつもりだと思います。これには、各メールボックスがIDを持ち、プロセスがMailbox.Sendの代わりにIDにメッセージを送信できるIDシステムの実装も必要です。ローカルボックスはローカルメモリにアクセスできますが、リモートメールボックスはアクセスできないため、これは簡単ではありません。

私はRPyC(http://rpyc.wikidot.com/)のようなものを探していますが、あなたが探しているプロトコルと多少異なる場合があります。

基本的に答えは「いいえ」です。これを行うには本当に良い方法はありません。

+0

これはエージェントを持つ他の言語でどうなるか知っていますか?Erlang、Scala and co?ありがとう! – jlezard

+0

Erlangでは、あなたは共有メモリを持っていません。各「スレッド」は実際には別個のプロセスです。だからあなたは 'ピッド! "foo" 'pidは' 'foo ''が送られるプロセスのIDです。共有メモリはなく、プロセスにはすでにpidがあるので、pidからIPへのマッピングの辞書を作成し、その情報に基づいてメッセージを渡すだけで簡単にネットワーキングできます。この方法の問題は、すべての通信がメッセージの受け渡しを経て行われなければならず、現在はメッセージのメモリコピーも含まれていることです。パフォーマンス上の理由から、これは必ずしも最良ではありません。 Scalaの経験はありません。 –

+0

ErlangプロセスはOSプロセスではなく、VMプロセスです。 Erlangプロセスには、数百バイトのメモリオーバーヘッドがあります。 OSプロセスは、マルチKB範囲にオーバーヘッドを持ちます。 –

関連する問題