Come funzionano gli attori rispetto ai thread?


88

C'è qualche buona e breve spiegazione di come funziona Actors rispetto ai thread?

Un thread non può essere visto come un attore e inviare messaggi ad altri thread? Vedo qualche differenza, ma non è così chiara per me. Posso utilizzare gli attori in qualsiasi lingua utilizzando i thread in modo diverso?

Risposte:


78

Il modello dell'attore opera sul passaggio dei messaggi. I singoli processi (attori) possono inviare messaggi in modo asincrono tra loro. Ciò che lo distingue da ciò che normalmente pensiamo come il modello di threading, è che non esiste (almeno in teoria) uno stato condiviso. E se si crede (giustamente, penso) che lo stato condiviso sia la radice di tutti i mali, allora il modello dell'attore diventa molto attraente.

Tuttavia, non dovremmo eccitarci. Il modello dell'attore non rende (contrariamente ad alcune accuse) impossibile avere deadlock. Il modello attore, inoltre, non impedisce di avere conflitti per le risorse tra processi diversi, ad esempio le code di messaggi. Il modello è solo "senza blocco" al di sopra di un certo livello. A un livello inferiore, per coordinare le code di messaggi, è ancora richiesto il blocco.

Un thread non può essere visto come un attore e inviare messaggi ad altri thread?

Ebbene sì e no. No, se stai solo usando l'approccio di mettere mutex intorno alle posizioni di memoria condivisa. Quindi i thread condividono questo stato: entrambi hanno accesso a questa memoria, possono sia leggerla, riscriverla, ecc. sotto. Ho messo insieme qualcosa di simile (molto male) dando a ogni thread una coda protetta da un mutex - solo per divertimento. Per avere un'idea di come viene gestita l'impedenza del thread dell'attore, vedere la mia domanda di un anno fa .

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

Sì, ma ci vorrà un po 'più di lavoro. La tua lingua preferita potrebbe avere una libreria di passaggio di messaggi, quindi sarebbe la prima cosa da indagare. Inoltre, dovresti esaminare l'uso di strutture di dati immutabili. Si noti che se una struttura dati è immutabile, in sostanza hai affrontato il problema dello "stato condiviso": più thread possono contenere riferimenti a dati immutabili senza che accada nulla di male. C'è una ragione per cui i linguaggi degli attori tendono ad essere anche linguaggi funzionali (erlang, scala).

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


3
Più utilizzo modelli di concorrenza basati sul passaggio di messaggi asincroni (ad esempio, attori o async / await), più penso che siano semplicemente doppi del vecchio modello di concorrenza di blocco sincronizzato standard. Il passaggio di messaggi asincrono non è realmente più facile o più difficile che usare blocchi e monitoraggi. In effetti, non esiste uno stato mutabile condiviso, ma solo a livello di singolo attore . 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.
Piotr Kołaczkowski

2

Non direi che gli attori trasmettono sempre i messaggi in modo asincrono, sarebbe troppo lento. Caso in questione, il progetto JActor utilizza messaggi a 2 vie (richiesta / risposta) per modellare meglio una chiamata di metodo. E la maggior parte delle richieste viene soddisfatta in modo sincrono.

Anche JActor (una libreria Java) non utilizza i blocchi. Solo alcune strutture dati atomiche e simultanee, con pochi semafori inseriti. Il passaggio dei messaggi è di circa 0,8 miliardi di messaggi al secondo.

https://github.com/laforge49/JActor


2
Il modello dell'attore viene definito utilizzando solo la comunicazione asincrona ( en.wikipedia.org/wiki/Actor_model ). Se JActor non lo fa, allora non è solo il modello dell'attore al 100%. Può semplicemente usare il modello dell'attore come una delle molte delle sue caratteristiche.
BT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.