代码之家  ›  专栏  ›  技术社区  ›  Sebastian

来自阻塞调用的多个参与者调用

  •  4
  • Sebastian  · 技术社区  · 16 年前

    这对受过斯卡拉教育的人来说可能是个简单的问题,但我还是个初学者;)

    我有一个基础演员,他将一个任务分派给多个工作人员,并通过回复结果来阻止外部调用!?

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

    现在我不知道如何真正地将阻塞调用中的工作参与者并行化,因为最后我必须回复()。呼叫中心不是演员,只是一个普通班。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Alexander Azarov    16 年前

    您可以创建几个未来,然后生成一个单独的参与者来等待他们的结果。因此,您的发送将为新的请求做好准备。代码片段如下:

    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]] ,这样您就可以了解是否出了问题,而您的工作人员没有及时完成任务。

    推荐文章