17

379 ページの Expert F# のコピーに次のコメントがあることに気付きました。

メッセージの受け渡しと処理

多くの場合、共有メモリの同時実行メッセージ パッシングの同時実行は区別され ます。多くの場合、前者はローカル マシンでより効率的です。これについては、この章で後述する「共有メモリの同時実行の使用」セクションで説明します。後者は、分散システムなどの共有メモリがないシステムに対応し、共有メモリに関連するパフォーマンスの問題を回避するためにも使用できます。

共有メモリのないプロセス間の同時並行性を渡すメッセージに興味があります。MailboxProcessor の使用方法を示す Expert F# およびインターネット上のすべての例には、このコードのいくつかのバリエーションが含まれています。

let counter =
    MailboxProcessor.Start(fun inbox ->
        let rec loop n =
            async {
                do printfn "n = %d, waiting... " n
                let! msg = inbox.Receive()
                match msg with
                    | -1 ->
                        do printfn "'Til the bitter end..."
                        return ()
                    | n -> return! loop(n + msg)
            }
        loop 0)

counter.Post(20)
counter.Post(50)
counter.Post(-1) // kill mailbox

つまり、チャネルにメッセージを投稿する前に、共有メモリ内の MailboxProcessor のハンドルを取得する必要があります。私の知る限り、これは Erlang スタイルの同時実行ではありません。メッセージは同じプロセス (注: スレッドではなくプロセス) 内の MailboxProcessors にのみポストできるからです。

1 つのプロセス内の 1 つの MailboxProcessor が別の MailboxProcessor プロセスにメッセージを送信することは可能ですか? もしそうなら、サンプルを提供していただけますか?

4

3 に答える 3

8

用語に少し混乱していると思います。Erlang プロセスは、必ずしも OS プロセスに直接対応しているわけではありません。プロセスが複数のスレッドを持つように、特定の OS プロセスは複数の Erlang プロセスを持つことができます (通常はそうします)。複数の OS プロセス間で通信したい場合は、System.Runtime.Remoting.Channels.Ipcを確認してください。おそらく、MailboxProcessor スタイルのラッパーをこれらの API の周りに作成できます。

于 2009-02-02T03:37:38.987 に答える
8

MailboxProcessor と AsyncReplyChannel は、Erlang の「pid bang」(Pid !) 操作と同じ場所の透過性を提供しません。もちろん、これは分散 Erlang ノードが適切に構成されている場合にのみ機能します。つまり、名前、DNS、同期モジュール、Cookie などです。OTP には、この管理を容易にする機能がいくつかあります。もちろん、Erlang プロセスが同じノード上にあれば、そのまま動作します。しかし、分散Erlangにはいくつかのしわがあります。

「ネットワークは安全です。」 組み込みの分散 Erlang メカニズムは、ネットワークが安全であることを前提としています。そのため、セキュリティが必要な場合は、プロキシ Erlang プロセスを使用したソケットベースの通信アプローチが採用されます。

「ネットワークは信頼できます。」 分散型 Erlang が機能する理由の 1 つは、そのエラー処理の哲学です。つまり、プロセスは信頼できないため、プロセス モニターを通信することによってのみフォールト トレランスが達成されるということです。OTP は、この哲学を実装するためのパターン (つまり、スーパーバイザー) を成文化します。Erlang での信頼性の高いメッセージングは​​、RabbitMQ で行われたように Mnesia (分散データベース) を介して実現できますが、すぐに使用できるわけではありません。

結局、分散通信は決して簡単ではありません。F# で AsynchWorker を実装して、プロキシとして機能し、AsynchReplyChannel.Send を介して通信することができます。分散コンピューティングの誤謬については、まだ考えなければなりません。

最後に、メッセージ パッシング スタイルの同時実行性は、プロセス外通信を意味するものではありません。これは、ロックで管理する共有状態がないことを意味するため、並列計算のモデルがよりシンプルでエラーが発生しにくくなります。この素数ふるいは、このスタイルの同時実行の良い例だと思います。F# の例は、メッセージ パッシング用の組み込み構文がないため、Squeak や Erlang の実装ほど美しくはありませんが、機能します。

于 2010-07-21T19:11:27.273 に答える
1

多分これで済む

F# エージェントを使用した Map Reduce

フィードバックはあまり得られていないので、100% 正しいとは言えません。悪いと思われる場合はお知らせください。

感謝!

于 2011-02-08T16:51:29.507 に答える