Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何等待Akka演员系统终止?_Scala_Akka - Fatal编程技术网

Scala 如何等待Akka演员系统终止?

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

我需要启动Akka(2.0)actor系统,发送一些消息,然后等待它完成繁重的工作。在那之后,我需要做一些与那些演员无关的事情

我试图用以下代码等待所有参与者停止:

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