Scala 在akka调度程序中关闭actor上下文是否安全

Scala 在akka调度程序中关闭actor上下文是否安全,scala,akka,Scala,Akka,我知道关闭发送方方法调用或参与者在将来的内部状态或调度程序是不安全的,但是参与者上下文呢?ActorContext中有什么内容?在调度程序或将来的回调中关闭actor上下文是否安全,如下所示: def接收:接收={ case Msg=> system.scheduler.scheduleOnce(1秒){ context.actorOf[ChildActor] } } 不,关闭参与者上下文是不安全的。来自akka的资料来源: /** * Stores the context for thi

我知道关闭
发送方
方法调用或参与者在将来的内部状态或调度程序是不安全的,但是参与者上下文呢?
ActorContext
中有什么内容?在调度程序或将来的回调中关闭actor上下文是否安全,如下所示:

def接收:接收={
case Msg=>
system.scheduler.scheduleOnce(1秒){
context.actorOf[ChildActor]
}
}

不,关闭参与者上下文是不安全的。来自akka的资料来源:

/**
   * Stores the context for this actor, including self, and sender.
   * It is implicit to support operations such as `forward`.
   *
   * WARNING: Only valid within the Actor itself, so do not close over it and
   * publish it to other threads!
   *
   * [[akka.actor.ActorContext]] is the Scala API. `getContext` returns a
   * [[akka.actor.UntypedActorContext]], which is the Java API of the actor
   * context.
   */
implicit val context: ActorContext = { ...

我相信如果演员的状态是不变的,那么关闭它是安全的。我不确定
上下文是否是不可变的。即使是,如果是远程参与者(在Akka集群模式下运行),关闭上下文也会通过网络发送上下文。。。不,不是。最好让计划程序向self发送另一条消息,然后让参与者创建该子项。@LMeyer-当然,如果它不是线程安全的,就不应该关闭它。@Ryan-向self发送一条消息,然后采取一些措施(在本例中,创建一个新参与者)是我目前解决这个问题的方式,我的代码。应该更仔细地阅读javadoc或源代码。非常感谢。虽然这个答案是正确的,但值得注意的是,
ActorContext
上有一些字段可以以线程安全的方式访问。