Scala Akka线程安全与期货

Scala Akka线程安全与期货,scala,akka,Scala,Akka,我有一个演员的状态是可变的。在我的receive方法中,我对消息进行模式匹配,并调用一些将返回未来的服务。这个未来将修改我的Actor实例中的状态。这种状态不是线程安全的吗?由于未来将在不同的线程中执行,因此我的Actor中的状态是否保证线程安全?否,这将不会像您正确假设的那样是线程安全的。期货在执行上下文提供的任何线程上运行 解决这一问题的方法是将其反馈给同一个参与者。所有参与者的输入必须始终是消息。你可以找到那个 一些示例代码: import akka.pattern.pipe //...

我有一个演员的状态是可变的。在我的receive方法中,我对消息进行模式匹配,并调用一些将返回未来的服务。这个未来将修改我的Actor实例中的状态。这种状态不是线程安全的吗?由于未来将在不同的线程中执行,因此我的Actor中的状态是否保证线程安全?

否,这将不会像您正确假设的那样是线程安全的。期货在执行上下文提供的任何线程上运行

解决这一问题的方法是将其反馈给同一个参与者。所有参与者的输入必须始终是消息。你可以找到那个

一些示例代码:

import akka.pattern.pipe

//... inside the Actor somewhere:
val futureResult: Future[YourType] = something.thatReturnsAFuture()
futureResult.pipeTo(self)
然后修改接收块,以便在将来完成后处理结果,并将其发送回此参与者:

case result: YourType => //...

不,这不会像您正确假设的那样是线程安全的。期货在执行上下文提供的任何线程上运行

解决这一问题的方法是将其反馈给同一个参与者。所有参与者的输入必须始终是消息。你可以找到那个

一些示例代码:

import akka.pattern.pipe

//... inside the Actor somewhere:
val futureResult: Future[YourType] = something.thatReturnsAFuture()
futureResult.pipeTo(self)
然后修改接收块,以便在将来完成后处理结果,并将其发送回此参与者:

case result: YourType => //...

您可以使用pipeTo模式处理参与者内部的未来和可变状态。执行context.been如何?@user3102968 context.been仍然无法解决修改内部可变状态时的问题。到那时,参与者可能正在处理不同的消息,当未来也在修改内部状态时,您将有一个竞争条件。另外,如果我的答案是解决方案,请将其标记为已接受,谢谢。您可以使用pipeTo模式处理参与者内部的未来和可变状态。执行context.been如何?@user3102968 context.been仍然无法解决修改内部可变状态时的问题。到那时,参与者可能正在处理不同的消息,当未来也在修改内部状态时,您将有一个竞争条件。另外,如果我的答案是解决方案,请将其标记为已接受,谢谢。