2009-02-01 14 views
16

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?

risposta

8

Penso che tu sia stato un po 'confuso dalla terminologia. I processi di Erlang non corrispondono necessariamente direttamente ai processi del sistema operativo. Un dato processo OS può avere più processi di Erlang (e di solito lo fa), proprio come il tuo processo ha più thread. Se si desidera comunicare tra più processi del sistema operativo, si consiglia di controllare System.Runtime.Remoting.Channels.Ipc. È probabile che un wrapper stile MailboxProcessor possa essere creato attorno a queste API.

8

MailboxProcessor e AsyncReplyChannel non forniscono la stessa trasparenza di posizione dell'operazione "pid bang" (Pid!) In Erlang. Ovviamente, questo funziona solo quando i nodi Erlang distribuiti sono configurati correttamente, ovvero nomi, DNS, moduli sincronizzati, cookie, ecc. Ci sono alcune funzionalità in OTP per semplificare questa amministrazione. Naturalmente, se i processi di Erlang si trovano sullo stesso nodo, funziona semplicemente. Ma ci sono alcune rughe con Erlang distribuito.

"La rete è sicura." I meccanismi integrati di Erlang distribuiti presuppongono che la rete sia sicura. Quindi, un approccio di comunicazione basato su socket con processi proxy di Erlang viene utilizzato quando la sicurezza è necessaria.

"La rete è affidabile." Una delle cose che rendono Erlang distribuito è la sua filosofia di gestione degli errori, vale a dire che i processi sono inaffidabili e quindi la tolleranza agli errori viene raggiunta solo comunicando i monitor di processo. OTP codifica modelli (ad esempio supervisore) per implementare questa filosofia. La messaggistica affidabile in Erlang può essere ottenuta tramite Mnesia (un database distribuito), come è stato fatto in RabbitMQ, ma non lo si può ottenere immediatamente.

Alla fine, le comunicazioni distribuite non sono mai così facili. Potremmo implementare un AsynchWorker in F # per agire come nostro proxy e comunicare con esso tramite AsynchReplyChannel.Send. Dobbiamo ancora pensare agli errori del calcolo distribuito.

Infine, il messaggio che passa la concorrenza di stile non implica comunicazione out-of-process. Ciò implica che non esiste uno stato condiviso da gestire con i blocchi, quindi un modello di calcolo parallelo più semplice e meno soggetto a errori. Penso che questo Prime Number Sieve sia un ottimo esempio di questo stile di concorrenza. L'esempio di F # non è esteticamente gradevole come lo Squeak o un'implementazione di Erlang, a causa della mancanza di sintassi incorporata per il passaggio dei messaggi, ma funziona.

1

Forse questo farà

Map Reduce with F# agents

non ho ottenuto molto di feedback in modo non certo la sua corretta al 100%. Se pensi che sia male per favore fammi sapere.

Grazie!