ho notato il seguente commento nella mia copia di Expert F # a pagina 379:processore Mailbox su sistemi distribuiti
Passaggio e che elabora i messaggi
una distinzione è spesso fatta tra memoria condivisa concorrenza e messaggio passaggio concorrenza. Il primo è spesso più efficiente sulle macchine locali ed è trattato nella sezione "Uso della concorrenza della memoria condivisa " più avanti in questo capitolo. Quest'ultima scala per i sistemi in cui non è presente memoria condivisa , ad esempio, distribuiti e può essere utilizzata anche per evitare problemi di prestazioni associati alla memoria condivisa .
Sono interessato a passare il messaggio di concomitanza tra processi senza memoria condivisa. Tutti gli esempi di Expert F # e su internet che dimostrano come utilizzare il MailboxProcessor contiene qualche variazione di questo codice:
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
In altre parole, è necessario disporre di una maniglia sul tuo MailboxProcessor in memoria condivisa prima puoi postare messaggi sul suo canale. Questa non è concorrenza in stile Erlang per quanto ne so, dal momento che puoi solo inviare messaggi a MailboxProcessors nello stesso processo (nota: processo, non thread).
E 'possibile che un solo MailboxProcessor in un processo invii messaggi ad un altro processo MailboxProcessor? Se sì, potresti fornire un campione?