像 system.shutdown 和 awaitTermination
akka system.shutdown and awaitTermination
在我的程序的最后调用了以下代码(它是用 JRuby 编写的):
@na.tell(PoisonPill) if defined? @na # @na, @sa and @pe are Actors
@sa.tell(PoisonPill) if defined? @sa
@pe.tell(PoisonPill) if defined? @pe
@@system.shutdown # @@system is the ActorSystem
@@system.awaitTermination
我发现了这种方法 here 但我不明白为什么它有效。
是否awaitTermination
等待所有Actor终止?
调用awaitTermination
之前@@system
不是已经关闭了吗?
编辑: 我注意到我什至不需要调用 tell(PoisonPill)
。我把它注释掉了,它仍然有效...
好的,我现在解决了。当我调用 system.shutdown
时,所有参与者都在完成当前任务后终止。这不是我想要的,因为队列中可能还有更多任务。
所以我在主线程结束时向每个演员发送一个 PoisonPill,然后等待他们终止。我还在每个演员中使用函数 postStop
来设置一个 finished
标志并在所有演员完成后关闭 system
。
import Actors # needed for Java-style poisonPill
actor1.tell(Actors::poisonPill) # for Akka 2.0.0
actor2.tell(Actors::poisonPill)
system.awaitTermination
在我的程序的最后调用了以下代码(它是用 JRuby 编写的):
@na.tell(PoisonPill) if defined? @na # @na, @sa and @pe are Actors
@sa.tell(PoisonPill) if defined? @sa
@pe.tell(PoisonPill) if defined? @pe
@@system.shutdown # @@system is the ActorSystem
@@system.awaitTermination
我发现了这种方法 here 但我不明白为什么它有效。
是否awaitTermination
等待所有Actor终止?
调用awaitTermination
之前@@system
不是已经关闭了吗?
编辑: 我注意到我什至不需要调用 tell(PoisonPill)
。我把它注释掉了,它仍然有效...
好的,我现在解决了。当我调用 system.shutdown
时,所有参与者都在完成当前任务后终止。这不是我想要的,因为队列中可能还有更多任务。
所以我在主线程结束时向每个演员发送一个 PoisonPill,然后等待他们终止。我还在每个演员中使用函数 postStop
来设置一个 finished
标志并在所有演员完成后关闭 system
。
import Actors # needed for Java-style poisonPill
actor1.tell(Actors::poisonPill) # for Akka 2.0.0
actor2.tell(Actors::poisonPill)
system.awaitTermination