2009-07-20 8 views
4

Dies ist wahrscheinlich ein einfaches Problem mit dem scala gebildeten Geist, aber ich bin immer noch ein Anfänger;)Mehrere Schauspieler Aufruf von Anrufblockierung

Ich habe einen Basis Schauspieler, der eine neue Aufgabe auf mehrere Arbeiter Akteure entsendet und antwortet es Ergebnis zu einem blockierenden externen Anruf über!?

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) 
} 

Nun weiß ich nicht, wie man wirklich die Arbeiter Akteure in dem blockierenden Aufruf parallelisieren, weil ich am Ende antworten habe(). Die rufende Entität ist kein Schauspieler, nur eine reguläre Klasse.

Antwort

2

Sie können mehrere Futures erstellen und dann einen separaten Actor spawnen, um auf ihre Ergebnisse zu warten. So ist Ihr Versand für neue Anfragen bereit. Das Code-Snippet folgt:

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.. } } 

Bitte beachten Sie awaitAll kehrt List[Option[Any]], so können Sie lernen, wenn etwas schief gelaufen ist und Ihre Arbeiter Schauspieler erreichen nicht die Aufgabe, in der Zeit

+0

Danke, ich werde es versuchen . – Sebastian

+0

Und wenn sie die Aufgabe nicht rechtzeitig erfüllen, wie stoppt man sie? http://stackoverflow.com/questions/1245937/practical-use-of-futures-ie-how-to-kill-them – DrGary