В моей копии эксперта F # на странице 379 я заметил следующий комментарий:
Передача и обработка сообщений
Часто проводится различие между shared-memory concurrency и сообщение прохождение concurrency. Первый часто более эффективны на локальных машинах и рассматривается в разделе "Использование Shared-Memory Concurrency" позже в эта глава. Последнее масштабируется до систем, в которых нет общих памяти, например, распределенных систем, а также может использоваться для проблемы производительности, связанные с разделяемая память.
Мне интересно передавать сообщения concurrency между процессами без общей памяти. Все примеры в Expert F # и в Интернете, которые демонстрируют, как использовать MailboxProcessor, содержат некоторые изменения этого кода:
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
Другими словами, вы должны иметь дескриптор вашего почтового сервера в общей памяти, прежде чем отправлять сообщения на его канал. Это не стиль Erlang concurrency, насколько я знаю, поскольку вы можете отправлять сообщения только MailboxProcessors в одном и том же процессе (обратите внимание: процесс, а не поток).
Возможно ли, чтобы один MailboxProcessor в одном процессе отправил сообщения другому процессу MailboxProcessor? Если да, можете ли вы предоставить образец?