2009-10-24 16 views
15

Posso impostare la dimensione massima per la cassetta postale di un attore in Scala?limite dimensioni casella postale

Prendere il problema Produttore-Consumatore. Con i thread posso bloccare i produttori quando il buffer si riempie. Ho visto un paio di esempi produttore-consumatore scritti in Scala e tutti usano attori con caselle di posta usate come "buffer". Posso impostare le dimensioni della casella di posta affinché i produttori attenderanno fino a quando un consumatore non sarà pronto? Qualche altra soluzione elegante per evitare una crescita incontrollata delle caselle di posta?

risposta

16

È possibile creare un attore che funge da buffer tra il produttore e il consumatore. Il buffer controlla la sua casella di posta sui dati del ciclo. Restituisce un messaggio di "overload" al produttore quando il numero di prodotti bufferizzati è troppo alto; e invia un messaggio "chiaro" una volta che tutto è tornato in ordine. In caso di troppi messaggi, semplicemente si eliminano quelli in entrata (o quelli più vecchi).

Il consumatore richiede attivamente i prodotti dal buffer, che a sua volta restituisce un prodotto. Se il buffer è vuoto, il consumatore continua ad attendere l'input.

Il produttore invia prodotti all'attore di buffer. Se riceve un messaggio di "sovraccarico", può interrompere la produzione o continuare a produrre, sapendo che i prodotti potrebbero cadere.

Naturalmente questa logica potrebbe essere implementata direttamente nel produttore o nel consumatore stesso, ma un buffer separato consentirà di introdurre più produttori e/o consumatori più facilmente.

5

Il metodo Actor.mailboxSize restituisce il numero di messaggi in sospeso nella cassetta postale di Actor.

Questo può essere utilizzato per limitare il produttore in vari modi.

Per esempio, una possibilità potrebbe essere,

I controlli di produttori, dei consumatori mailboxSize è maggiore di una certa soglia. Se lo è, invia un SpecialMessage al consumatore e blocca su un semaforo. Quando il consumatore riceve questo SpecialMessage rilascia il semaforo. Il produttore può ora allegramente continuare il suo business.

Ciò evita il polling e tutti i messaggi rilasciati.

+1

Il polling mi sembra più appropriato che rendere la casella di posta del consumatore uno "stato condiviso" tra due attori. – Zed

+1

Il polling è spesso meglio da una prospettiva puramente di programmazione, ma i semafori sono spesso migliori dal punto di vista dell'utilizzo dell'hardware. Dipende dalla tua situazione esatta su quale dovrebbe essere selezionato. –

+0

@Zed La casella di posta del consumatore è stato condiviso! Altrimenti il ​​produttore non sarebbe in grado di inviare alcun messaggio ad esso :) – HRJ

Problemi correlati