2011-04-11 1 views
6

Je suis en train de concevoir un acteur qui consomme des éléments à partir d'un flux infini et qui a besoin d'un moyen de contrôler quand il démarre et arrête d'utiliser des messages. Existe-t-il un modèle commun pour implémenter des boucles interruptibles comme celle-ci avec les acteurs? Je pensais juste à ce que mon acteur envoie des messages à lui-même. Quelque chose comme (pseudo Scala):Modèle pour les boucles interruptibles utilisant des acteurs

class Interruptible extends Actor { 
    val stream: Stream 
    val running: boolean 

    def receive = { 
    case "start" => { 
     running = true 
     consumeItem 
    } 

    case "stop" => { 
     running = false 
    } 

    case "consumeNext" => consumeItem 
    } 

    def consumeItem { 
    if (running) { 
     stream.getItem 
     this ! "consumeNext" 
    } 
    } 
} 

Est-ce la meilleure façon de faire les choses?

Merci!

+2

Selon nos derniers chiffres ne Akka environ 3 millions de messages par seconde sur une machine à 8core. Êtes-vous sûr de ne pas optimiser prématurément ici? –

+0

Merci pour votre réponse, Viktor. J'ai reformulé la question sur le design. J'essaie juste de comprendre le modèle de l'acteur! Akka est super, BTW. -D – spieden

Répondre

8

Peut-être encodées comme ceci:

class Interruptible extends Actor { 
    val stream: Stream 

    def inactive: Receive = { // This is the behavior when inactive 
    case "start" => 
     self become active 
    } 

    def active: Receive = { // This is the behavior when it's active 
    case "stop" => 
     self become inactive 
    case "next" => 
     doSomethingWith(stream.getItem) 
     self ! "next" 
    } 

    def receive = inactive // Start out as inactive 
} 

Cheers,

+0

Ça a l'air génial, merci. – spieden

+0

Ça a l'air génial, mais comment "devenir actif" pourrait-il être mis en œuvre pour préserver l'élégance? Impossible de trouver la méthode 'devenir' dans akka avec scala 2.10. Ou est-ce un pseudocode? – dmitry

+2

Il est passé en "contexte" avec Akka 2.0. http://doc.akka.io/docs/akka/2.1.2/scala/actors.html#Become_Unbecome –