Scala 如何等待Akka演员系统终止?
我需要启动Akka(2.0)actor系统,发送一些消息,然后等待它完成繁重的工作。在那之后,我需要做一些与那些演员无关的事情 我试图用以下代码等待所有参与者停止:Scala 如何等待Akka演员系统终止?,scala,akka,Scala,Akka,我需要启动Akka(2.0)actor系统,发送一些消息,然后等待它完成繁重的工作。在那之后,我需要做一些与那些演员无关的事情 我试图用以下代码等待所有参与者停止: val system = new ActorSystem("parallelRunners") val master = system.actorOf(Props[Master]) master ! Start system.awaitTermination // <-- hangs here val系统=新的ActorSy
val system = new ActorSystem("parallelRunners")
val master = system.actorOf(Props[Master])
master ! Start
system.awaitTermination // <-- hangs here
val系统=新的ActorSystem(“并行运行程序”)
val master=system.actorOf(Props[master])
主人!开始
system.Shutdirection/我找到了解决方案-只需从主参与者调用system.shutdown:
context.system.shutdown
您还可以使用system.shutdown
从主线程杀死ActorSystem
。但该操作是异步的。如果需要阻止主线程直到其完成,则只需使用system.com
。如果您的ParallelRunner返回对程序其余部分有用的内容,则可能最容易不阻止并继续您的程序。从Akka 2.4开始,您应该使用system.awaitTermination()
,它返回您可以等待的未来[终止]
要终止系统,应在完成时在参与者内使用ActorSystem.terminate
(例如context.system.terminate()
)
来源:在scala 2.11的Akka 2.4.1中,它似乎又不同了
system.awaitTermination()
已被弃用,文档指示我们使用Await.result(system.wheinterminated,timeout)
如前所述,system.terminate
仍然是终止系统的方法
下面是我使用的一些示例代码:
val actorSystem = ActorSystem("ActorSystem")
val myActors = actorSystem.actorOf(Props[MyActor].withRouter(RoundRobinPool(10)), "MyActors")
rainbows.foreach(rainbow => myActors ! rainbow)
Await.ready(actorSystem.whenTerminated, Duration(1, TimeUnit.MINUTES))
然后在MyActor类中,我在Akka 2.3.9中有一行context.system.terminate()
,似乎关闭一个actor系统并等待它关闭是一个两步过程:
启动关机:
actorSystem.关闭
以阻塞方式等待其终止:
actorSystem.com终止
作为步骤(2)的替代方案,可能(尚未测试这些替代方案)您也可以在isTerminated
上进行轮询,或者在代码终止时使用registerOnTermination
来运行某些代码。因此,值得查看akka.actor.ActorSystem的注释,以了解并选择这些方法来实现
也许我错过了关于API的其他选项(?)作为未来的返回值可能会更好。对于那些在标题中遇到这个问题的人来说,这只是一个旁注:显然,Akka 2.5不再支持actorSystem.WaitTermination
。原因可能是Akka避免任何阻塞调用的理念。相反,actorSystem.registerOnTermination(…)
可用作关闭ActorSystem
时执行操作的非阻塞方式
尽管如此,您仍然可以通过actor系统提供的Future
等待您的actor系统完成
val system = new ActorSystem("parallelRunners")
val master = system.actorOf(Props[Master])
master ! Start
import scala.concurrent.Await
import scala.concurrent.duration._
Await.ready(system.whenTerminated, 365.days)
那么:
import scala.concurrent.Await
import scala.concurrent.duration._
Await.ready(system.terminate(), 5.seconds)
终止返回未来:
def terminate(): Future[Terminated]
您可以等待这个未来的完成。请注意:,您应该使用ActorSystem.terminate()
而不是ActorSystem.shutdown()