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

现在我不知道如何在阻塞调用中真正并行化工作角色,因为最后我必须回复()。调用实体不是演员,只是一个普通的班级。

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 回答