2009-07-20 6 views
4

Ceci est probablement un problème simple à l'esprit instruit scala mais je suis encore un débutant;)invocation acteur multiple de blocage des appels

J'ai un acteur de base qui envoie une tâche à plusieurs acteurs des travailleurs et des réponses qu'il est résultat à un appel externe bloquant via?

a = new a 

a.start 

println(a !? "12345") 



class a extends Actor { 

def act = { 
    loop { 
    react { 
     case msg => 
        val result = worker_actor_1 !? msg 
        result += worker_actor_2 !? msg 
        result += worker_actor_3 !? msg 
        // So I just have multiple workers who should do stuff in parallel and the aggregated result should be returned to the calling function 
        reply(result) 
} 

Maintenant, je ne sais pas comment paralléliser vraiment les acteurs des travailleurs dans l'appel de blocage, car à la fin, je dois répondre(). L'entité d'appel n'est pas un acteur, juste une classe régulière.

Répondre

2

Vous pouvez créer plusieurs contrats à terme, puis générer un acteur distinct pour attendre leurs résultats. Ainsi, votre envoi sera prêt pour de nouvelles demandes. L'extrait de code suivant:

case msg => 
    val invoker = sender 
    val flist = 
     worker_actor_1 !! task1 :: 
     worker_actor_2 !! task2 :: 
     worker_actor_3 !! task3 :: Nil 
    Scheduler.execute { invoker ! Futures.awaitAll(100, flist).map{ ..sum the results.. } } 

S'il vous plaît noter awaitAll retours List[Option[Any]], afin que vous puissiez apprendre si quelque chose a mal tourné et vos acteurs des travailleurs n'a pas accompli la tâche dans le temps

+0

Merci, je vais faire un essai . – Sebastian

+0

Et s'ils n'atteignent pas la tâche à temps, comment les arrêtez-vous? http://stackoverflow.com/questions/1245937/practical-use-of-futures-ie-how-to-kill-them – DrGary