2012-03-14 1 views
13

Appena iniziato su Scala Actors. Il Scala website dice:Scala attori: se la reazione non ritorna mai, perché ha bisogno di essere in un ciclo {}, e perché non mentre (vero) funziona?

operazioni della discussione-bloccanti possono essere evitati utilizzando react aspettare per nuovi messaggi (il ciondolo basato su eventi di receive). Tuttavia, c'è un prezzo da pagare (in genere piccolo): react non restituisce mai.

...

noti che usare react all'interno di un ciclo while non funziona! Tuttavia, poiché i loop sono comuni, esiste un supporto speciale per la libreria nel modulo di una funzione loop. Può essere utilizzato in questo modo:

loop { 
    react { 
    case A => ... 
    case B => ... 
    } 
} 

Ora sto confuso - sembra che ci sia una contraddizione:

a) Se react mai restituisce, allora qual è il punto di metterlo in un ciclo ?

b) Poiché loop esegue più volte un blocco, come è diverso per while(true) - il motivo per cui non si while lavoro, e in che modo lo fa "non funziona"?

risposta

11

Entrambe le funzioni, loop e react non sono puri. loop accetta una chiamata in base al parametro name e react a PartialFunction, entrambe impostano le variabili sull'attore raw. Questo perché un attore non ha un thread attaccato tutto il tempo. Diventerà attivo solo quando c'è un messaggio nella sua messagebox. Questo è il motivo per cui un while(true) porterà all'utilizzo della cpu al 100% e l'attore non risponde.

+0

Quindi la parte mancante della spiegazione del sito Web di Scala è che 'react' non ritorna _normalmente_ ma termina comunque (forse tramite un'eccezione?) E viene quindi chiamato ripetutamente? – DNA

+0

Non penso che sia una "parte mancante". È un dettaglio di implementazione e irrilevante per lo sviluppatore. L'informazione rilevante è che mentre (vero) non funziona. Se sei interessato ai dettagli puoi comunque guardare le fonti, lo faccio spesso per capire meglio le cose. – drexin

+2

È forse irrilevante se segui semplicemente la ricetta, ma è stato un grosso ostacolo nella spiegazione, per me - se qualcosa ritorna o no non è un dettaglio di implementazione (se stai provando ad eseguirlo/ripeterlo) - è assolutamente fondamentale! Ho dato una rapida occhiata alle fonti prima di fare la domanda ma seguirò il tuo consiglio per scavare un po 'più a fondo ... – DNA

1

Ho trovato una spiegazione che risponde parte a) della mia domanda, in one of Haller and Odersky's papers on Actors (il corsivo è mio sottostante):

L'idea centrale è la seguente: Un attore che attende in una ricezione affermazione è non rappresentato da un thread bloccato ma da una chiusura che cattura il resto del calcolo dell'attore. La chiusura viene eseguita una volta che un messaggio viene inviato all'attore che corrisponde a uno dei modelli di messaggio specificato nella ricezione. L'esecuzione della chiusura è \ piggy-back" sul filo del mittente.

Se la chiusura ricevente termina, il controllo viene restituito al mittente come se una procedura rendimenti. Se i blocchi di chiusura di ricezione in un secondo ricevere, controllo viene restituito al mittente generando un'eccezione speciale che si snoda stack di chiamata del ricevitore.

condizione necessaria per il regime di lavoro è che i ricevitori non ritornano normalmente al loro attore racchiude . In altre parole, nessun codice in un attore può dipendere dalla terminazione o il risultato di un blocco di ricezione ...

+0

Volevo vedere se potevo avere un modo per contattarti riguardo a un progetto di sviluppo/consulenza che potrebbe adattarsi al tuo abilità. Quale sarebbe un buon modo per raggiungere? – Jeremy

+0

Il mio profilo ha una email di contatto - ma al momento sono completamente occupato, mi dispiace. – DNA