【问题标题】:Multiple actor invocation from blocking call来自阻塞调用的多个参与者调用
【发布时间】:2010-11-12 09:16:54
【问题描述】:

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

我有一个基础 Actor,他将一个任务分派给多个工作 Actor,并通过 !? 将其结果回复到一个阻塞的外部调用?

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

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

【问题讨论】:

    标签: scala actor


    【解决方案1】:

    您可以创建多个期货,然后生成一个单独的演员来等待他们的结果。因此,您的调度将准备好接受新的请求。代码的sn-p如下:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2014-07-01
    • 2022-12-09
    • 2013-11-16
    相关资源
    最近更新 更多