Concorrenza e cancellazione basata sull'attore

4

Sto leggendo sulla concorrenza basata sugli attori e apprezzo la semplicità degli attori che elaborano sequenzialmente i messaggi su un singolo thread. Tuttavia c'è uno scenario che non è possibile vedere.

Supponiamo che l'attore A mandi un messaggio all'attore B, che poi esegue un'attività a lungo termine e restituisce un messaggio di completamento all'attore A. Come può l'attore A forzare l'attore B a cancellare l'attività a lungo termine dopo l'avvio?

Se l'attore B sta eseguendo l'attività nel suo thread della coda messaggi, non rileverà il messaggio di annullamento fino a quando non ha completato l'attività; se l'attore B esegue l'attività in un thread in background, sembra violare il principio degli attori.

Esiste un modo comune per gestire questo scenario con gli attori? Oppure ogni linguaggio / struttura di attore ha un approccio diverso? O questo non è un problema adatto per affrontare gli attori?

    
posta Akash 25.03.2012 - 10:34
fonte

3 risposte

4

È possibile includere nella struttura del comando un token booleano che indica se il comando è stato annullato. Gli attori che accodano questo comando possono conservare o memorizzare separatamente un riferimento al comando e quindi al token di cancellazione. Durante l'esecuzione del comando da parte di un secondo attore, in particolare durante l'attesa di processi esterni di lunga durata come la lettura / scrittura di file o stream, l'attore dovrebbe controllare periodicamente il valore di questo flag di annullamento. Per annullare il comando, qualsiasi thread con conoscenza del comando può impostare la cancellazione booleana, e il thread che esegue il comando vedrà che è stato annullato alla successiva ispezione, interrompere il lavoro, ripulire e uscire. Questo generalmente richiede che il codice relativo a un Comando sia progettato con la possibilità di essere cancellato; questo non richiede necessariamente la conoscenza del Comando stesso dal codice, ma di solito richiede il passaggio di un booleano per riferimento, che deve essere periodicamente testato all'interno del metodo.

    
risposta data 27.03.2012 - 19:40
fonte
2

Dividi un'operazione a lungo termine in blocchi e fai in modo che l'attore si invii un messaggio Continua.

    
risposta data 27.03.2012 - 02:34
fonte
0

Un modo per farlo è quello di costruire un oggetto controller. Questo controller ha la capacità di ricevere messaggi e indirizzare i comandi ad altri attori. Inoltre, si avrà un altro oggetto di lavoro in cui si verifica l'elaborazione effettiva (che è quella responsabile dell'operazione possibilmente lunga). Tale oggetto di lavoro dovrebbe essere in grado di accettare comandi dal controller e agire su di essi. Può controllare periodicamente una posizione di memoria per vedere se è necessario continuare l'elaborazione o meno.

    
risposta data 27.03.2012 - 19:30
fonte

Leggi altre domande sui tag