4

これはおそらく scala の教育を受けた心にとって単純な問題ですが、私はまだ初心者です ;)

タスクを複数のワーカー アクターにディスパッチし、!? を介してブロッキング外部呼び出しに結果として応答するベース アクターがあります。

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

結局、reply() をしなければならないので、ブロッキング呼び出しでワーカー アクターを真に並列化する方法がわかりません。呼び出しエンティティはアクターではなく、通常のクラスです。

4

1 に答える 1

2

いくつかの先物を作成してから、別のアクターをスポーンして結果を待つことができます。したがって、ディスパッチは新しいリクエストに対応できるようになります。コードのスニペットは次のとおりです。

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

awaitAllリターンに注意してくださいList[Option[Any]]。何かがうまくいかず、ワーカーアクターが時間内にタスクを完了しなかったかどうかを知ることができます。

于 2009-07-20T17:37:51.967 に答える