2010-05-31 15 views
6

Come funzionano i loop di messaggi in erlang, si sincronizzano quando si tratta di elaborare i messaggi?Loop di messaggi Erlang

Per quanto ho capito, il ciclo inizierà con "ricevere" un messaggio e quindi eseguire qualcosa e premere un'altra iterazione del ciclo.

Quindi, che deve essere la sincronizzazione? destra?

Se più client inviano messaggi allo stesso loop di messaggi, tutti questi messaggi vengono accodati ed eseguiti uno dopo l'altro oppure?

Per elaborare più messaggi in parallelo, è necessario generare più loop di messaggi in processi diversi, giusto?

Oppure ho frainteso tutto questo?

risposta

9

L'invio di un messaggio è asincrono. L'elaborazione di un messaggio è sincrona - un messaggio viene ricevuto alla volta - poiché ogni processo ha una propria (e unica) cassetta postale.

4

Dal manuale (Erlang concurrency

Ogni processo ha una propria coda di input per i messaggi che riceve. I nuovi messaggi ricevuti sono messi alla fine della coda. Quando un processo esegue una ricezione, il primo messaggio in la coda viene confrontata con il primo modello nella ricezione, se questo corrisponde, il messaggio viene rimosso dalla coda e vengono eseguite le azioni corrispondenti al modello
Tuttavia, se il primo modello non corrisponde, il secondo modello è testato, se questo corrisponde al messaggio viene rimosso dalla coda e vengono eseguite le azioni corrispondenti al secondo schema Se il secondo modello non corrisponde al il terzo viene provato e così via fino a quando non ci sono più schemi da testare. Se non ci sono più schemi da testare, il primo messaggio viene tenuto in coda e al posto del secondo messaggio. Se questo corrisponde a un modello, vengono eseguite le azioni appropriate e il secondo messaggio viene rimosso dalla coda (mantenendo il primo messaggio e tutti gli altri messaggi nella coda). Se il secondo messaggio non corrisponde, proviamo il terzo messaggio e così via fino a raggiungere la fine della coda. Se raggiungiamo la fine della coda, il processo blocca (arresta l'esecuzione) e attende finché non viene ricevuto un nuovo messaggio e questa procedura viene ripetuta.
Ovviamente l'implementazione di Erlang è "intelligente" e riduce al minimo il numero di volte in cui ogni messaggio viene testato rispetto agli schemi di ogni ricezione.

Quindi è possibile creare dei prioni con la regex, ma la concorrenza viene eseguita tramite più processi.