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

异步如何在基于参与者的系统中工作?

  •  0
  • Mandroid  · 技术社区  · 6 年前

    我知道在基于演员的系统中,比如Akka,演员是孤立工作的,不直接互动。相反,他们互相发送消息。参与者只需发送一条消息并转到其他任务。这有助于避免阻塞。

    但如果没有响应,actor就无法继续,那么它如何帮助实现异步行为呢?演员不需要等待回应吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Emiliano Martinez    6 年前

    通常,参与者不应该等待响应继续执行。参与者接收和发送消息,这是他们的目的,但一个参与者的进步是什么?。参与者可以实现协议或成为协议的一部分,但在等待某个事件发生时阻止内部线程执行不是一个好主意。

    class SomeActor(receiver: ActorRef) extends Actor {
    
       case SomeMessage(msg) => 
           receiver ! s"Hey ${msg}"
    
       case SomeResponse(resp) =>
           println(s"Received response ${resp}"
    
    }
    

    在本例中,参与者处理 异步地 一些消息事件,一旦它们到达,它会将它们发送给另一个,但它从未停止。在任何时候对“嘿…”的回应消息将出现,演员将执行打印消息的操作。

    另一种可能的实施方式:

    class SomeActor(receiver: ActorRef) extends Actor {
       case SomeMessage(msg) => 
         receiver ? s"Hey ${msg}" onComplete { case Success(resp) => 
            println(s"Received response ${resp}"
         }
    }
    

    我不使用这个,但它也不会阻止。它为每个传入消息创建未来,并在future的回调中处理响应。

    以下内容与您的问题更为相关:

    class SomeActor(receiver: ActorRef) extends Actor {
       case SomeMessage(msg) => 
            val resp = Await.result(receiver ? s"Hey ${msg}")
            println(s"Received response ${resp}" 
         }
    }
    

    这会阻止未来的执行,但通过这种方式,您将参与者用作同步执行单元,因此在这些场景中使用参与者没有任何意义,至少我不会这样做。