Programmazione Concorrente e Distribuita — Prof. Alessandro Ricci

Actors recap, chiusura del corso e Assignment 3

2026-05-04 5 min registrazione originale

In questa lezione

1. Actors in 90 secondi

Il messaggio chiave e semplice: un actor e uno stato incapsulato che reagisce solo ai messaggi. Niente accesso diretto allo stato altrui, niente controllo condiviso, solo comunicazione asincrona.

Idea chiave

Actor = mailbox + stato + comportamento. Il controllo vive nel messaggio che arriva, non in una variabile condivisa.

ConcettoIn pratica
sendInvia un messaggio senza bloccare il mittente
createIstanzia un nuovo actor con un comportamento preciso
becomeCambia il comportamento per il prossimo messaggio
macro-stepUn handler si completa prima di passare al messaggio successivo
send(other, "ping", self(), "ciao")
// invio asincrono: il mittente continua subito
public void ping(ActorName caller) {
  send(caller, "alive", self());
  become(new WaitingForAck());
}

Gli actor semplificano il ragionamento sulle race, ma diventano difficili da leggere se spezzi la logica in troppi handler senza un protocollo chiaro.

Attenzione

Un handler non deve bloccare. Se ti serve attesa, buffering o chaining: sposta la logica nel protocollo, non in un while infinito.

2. Cosa portiamo a casa dal corso

Siamo alla chiusura della parte introduttiva: da qui in poi il focus si sposta verso la parte distribuita, usando gli strumenti che avete gia visto per leggere protocolli, concorrenza e coordinazione.

Nota di fine corso

Nel ripasso di oggi tornano utili anche clock logici e vector clock: non come teoria isolata, ma come strumenti per capire l'ordine degli eventi nei sistemi distribuiti.

AsseDomanda da saper rispondere
Actor modelPerche elimina shared mutable state e riduce le race?
AsincroniaCome si coordina una risposta quando il mittente non aspetta?
Parte distribuitaCome ragioniamo su ordine, causalita e protocolli?

Oggi: ripasso degli actors e orientamento finale. L'obiettivo e consolidare il modello mentale, non aggiungere complessita nuova.

Venerdi: modulo 4.1 e passaggio alla parte distribuita. Qui i concetti vanno letti come estensione naturale di cio che gia conoscete.

Lunedi: anticipazione del quarto assignment, cosi avete tempo di leggere la traccia con calma e prepararvi prima della consegna.

3. Assignment 3: strategia di lettura

Il riferimento e sul sito, insieme a LabActivity11. In una lezione breve come questa il punto non e svelare il testo, ma dirvi come affrontarlo bene: cercate il protocollo, i ruoli e gli stati, non solo i dettagli superficiali.

Per l'assignment

Prima di scrivere codice, mappa la traccia in tre cose: chi parla con chi, quali messaggi esistono, e quali invarianti devono restare vere.

1. Leggi la traccia e individua gli attori/ruoli
2. Elenca i messaggi e le risposte possibili
3. Definisci lo stato minimo di ogni actor
4. Disegna i casi limite: ordine, assenza di messaggi, errori
5. Solo dopo passa all'implementazione
Suggerimento pratico

Se la traccia parla di request-reply, buffering o coordinazione, pensa subito in termini di mailbox e transizioni di stato. E il modo piu rapido per non perderti.

// schema mentale minimo
Actor client = ...;
Actor server = ...;

client.send(server, "request", id, payload);
// server decide se rispondere subito, accodare o cambiare stato

Verifica finale

Perche un actor riduce le race condition?

Perche lo stato resta incapsulato e il controllo passa solo attraverso messaggi asincroni, non tramite memoria condivisa.

Cosa significa macro-step semantics?

Che un handler viene eseguito fino in fondo prima che l'actor prenda in carico il messaggio successivo.

Qual e il primo passo per Assignment 3?

Tradurre la traccia in ruoli, messaggi, stato minimo e invarianti prima di scrivere implementazione.

Che cosa devi evitare dentro un handler?

Blocchi lunghi, wait attive e loop infiniti: rompono la reattivita del sistema.