我希望可以问这个问题。我正在使用akka并且有两个演员,其中一个是快速启动/创建的,另一个则慢得多。快速创建的一个要求另一个人(问题模式),并且消息被发送到死信,因为另一个尚未启动。让演员等待发送消息的首选方法是什么?我不是那么渴望让一个演员睡不着觉而不知道没有别的办法。
答案 0 :(得分:1)
我会使用Akka为Actors提供的功能become()/unbecome()
。我假设在以下代码中slowActor
由fastActor
创建。这里的诀窍是fastActor
将有两种行为:一种用于slowActor
何时开始,另一种用于何时准备开始工作。当slowActor
准备好后,它会向fastActor
发送一条消息,宣传能够接收消息的消息。 fastActor
watch
将slowActor
case object Ready
case object DoWork
case object WorkDone
class FastActor extends Actor with ActorLogging {
val slowActor = context.actorOf(SlowActor.props)
context.watch(slowActor)
def receive = slowActorNotReadyBehavior
def slowActorNotReadyBehavior = {
case DoWork => log.warning("Slow actor in not ready, I am sorry...")
case Ready => context.become(slowActorReadyBehavior)
}
def slowActorReadyBehavior = {
case DoWork => (slowActor ? DoWork).pipeTo(self)
case Terminated(ref) =>
log.error("Slow actor terminated")
context.unbecome()
//... do something with slowActor
}
}
class SlowActor extends Actor {
override def preStart = {
context.parent ! Ready
}
def receive = {
case DoWork =>
//do something
sender ! WorkDone
}
}
,如果它被终止,它将再次改变其行为。接下来该做什么取决于你的解决方案。
这是一个模拟代码作为指南(我没有编译代码,它可能包含一些错误):
driver.get(r"http://www.python.org")