Processador de caixa de correio em sistemas distribuídos
Percebi o seguinte comentário em minha cópia do Expert F # na página 379:
Passando e processando mensagens
É frequentemente feita uma distinção entresimultaneidade de memória compartilhada esimultaneidade de passagem de mensagem. O primeiro geralmente é mais eficiente em máquinas locais e é abordado na seção "Usando a simultaneidade de memória compartilhada" mais adiante neste capítulo. O último é escalado para sistemas em que não há memória compartilhada, por exemplo, sistemas distribuídos e também pode ser usado para evitar problemas de desempenho associados à memória compartilhada.
Estou interessado em passar mensagens simultâneas entre processos sem memória compartilhada. Todos os exemplos no Expert F # e na Internet que demonstram como usar o MailboxProcessor contêm algumas variações desse código:
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
Em outras palavras, você precisa controlar o seu MailboxProcessor na memória compartilhada antes de poder postar mensagens em seu canal. Isso não é simultaneidade no estilo Erlang, até onde eu sei, pois você só pode postar mensagens no MailboxProcessors no mesmo processo (nota: processo, não thread).
É possível que um MailboxProcessor em um processo envie mensagens para outro processo MailboxProcessor? Se sim, você poderia fornecer uma amostra?