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 プロセスにメッセージを送信することは可能ですか? もしそうなら、サンプルを提供していただけますか?