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.
fonte
2010-08-27 18:53:25
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. –