2010-08-27 13 views
77

Esiste una spiegazione buona e breve di come gli attori funzionano rispetto ai thread?Come funziona Actors rispetto ai thread?

Non è possibile visualizzare un thread come attore e inviare messaggi ad altri thread? Vedo alcune differenze, ma non è chiaro per me. Posso utilizzare attori in qualsiasi lingua utilizzando thread in modo diverso?

risposta

62

Il modello di attore opera sul trasferimento di messaggi. I singoli processi (attori) sono autorizzati a inviare messaggi in modo asincrono l'uno all'altro. Ciò che distingue questo da ciò che normalmente pensiamo sia il modello di threading, è che non esiste (almeno in teoria) uno stato condiviso. E se uno crede (giustamente, penso) che lo stato condiviso sia la radice di tutto il male, allora il modello dell'attore diventa molto attraente.

Non dovremmo però esagerare. Il modello dell'attore non (contrariamente ad alcune accuse) rende impossibile avere deadlock. Il modello degli attori inoltre non impedisce di avere contese per le risorse tra diversi processi: le code di messaggi, per esempio. Il modello è solo "bloccato" sopra un certo livello. Ad un livello inferiore, per il coordinamento delle code dei messaggi, è ancora necessario il blocco.

Non è possibile visualizzare un thread come attore e inviare messaggi ad altri thread?

Bene, sì e no. No, se stai solo usando l'approccio di mettere mutex attorno a posizioni di memoria condivisa. Quindi i thread condividono questo stato: entrambi hanno accesso a questa memoria, possono leggerlo, riscriverlo, ecc. Ma è possibile creare un modello di attore su un modello di threading e in effetti tutte le implementazioni dell'attore hanno thread sotto. Ho hackerato insieme qualcosa di simile (molto male) dando a ogni thread una coda custodita da un mutex - solo per divertimento. Per avere un'idea di come viene gestita l'impedenza del thread dell'attore, vedere my question from a year ago.

Posso utilizzare il modello di attore in qualsiasi lingua utilizzando thread in modo diverso?

Sì, ma ci vorrà un po 'più di lavoro. La tua lingua preferita potrebbe avere una libreria che trasmette messaggi, quindi sarebbe la prima cosa da investigare. Inoltre, dovresti studiare l'uso di strutture di dati immutabili. Si noti che se una struttura dati è immutabile, si è essenzialmente trattato del problema dello "stato condiviso": più thread possono contenere riferimenti a dati immutabili senza che si verifichino eventi negativi. C'è una ragione per cui le lingue degli attori tendono ad essere anche linguaggi funzionali (erlang, scala).

Si potrebbe anche voler dare un'occhiata alla memoria transazionale del software, che è un modello diverso ma anche convincente. Clojure è il mio esempio preferito di questo.

+2

Più uso messaggio asincrono passando modelli basati concorrenza (ad esempio attori o asincrona/Aspetto), più penso che sono solo duale del vecchio standard sincronizzato bloccando modello di concorrenza. Il passaggio di messaggi asincroni non è in realtà più semplice o più difficile rispetto all'utilizzo di serrature e monitor.Infatti, non esiste uno stato mutabile condiviso, ma solo al livello * di attore singolo *. Ma un attore ha ancora uno stato mutevole, ed è effettivamente osservabile da tutti gli attori che collaborano con esso. Quindi puoi avere tutti gli stessi problemi: deadlock, livelock, fame, condizioni di gara, ecc. –

2

Non direi che gli attori passano sempre messaggi in modo asincrono - sarebbe troppo lento. Caso in questione, il progetto JActor utilizza i messaggi bidirezionali (richiesta/risposta) per modellare meglio una chiamata al metodo. E la maggior parte delle richieste viene revisionata in modo sincrono.

Anche JActor (una libreria Java) non utilizza i blocchi. Solo alcune strutture di dati atomici e concorrenti, con alcuni semafori lanciati. Il passaggio dei messaggi è di circa 8 miliardi di messaggi al secondo.

https://github.com/laforge49/JActor

+1

Il modello di attore è definito usando solo la comunicazione asincrona (http://en.wikipedia.org/wiki/Actor_model). Se JActor non lo sta facendo, allora non è solo il 100% del modello dell'attore. Può semplicemente usare il modello di attore come uno dei molti dei suoi aspetti. –

Problemi correlati