在我的项目中,我正在使用Akka的演员.根据定义,Actors是线程安全的,这意味着在Actor的receive方法中
def receive = {
case msg =>
// some logic here
}
Run Code Online (Sandbox Code Playgroud)
一次只有一个线程处理注释的代码段.但是,当此代码异步时,事情开始变得更加复杂:
def receive = {
case msg =>
Future {
// some logic here
}
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确此,在这种情况下,只有未来的结构将同步,可以这么说,并没有逻辑里面的未来.
当然,我可以阻止未来:
def receive = {
case msg =>
val future = Future {
// some logic here
}
Await.result(future, 10.seconds)
}
Run Code Online (Sandbox Code Playgroud)
这解决了问题,但我认为我们都应该同意这不是一个可以接受的解决方案.
所以这就是我的问题:在异步计算的情况下如何在不阻塞Scala的期货的情况下保留actor的线程安全特性?
在没有块Scalas的异步计算的情况下,如何保留actor的线程安全特性
Future?
这个假设只有在你首先修改Future其中似乎是设计气味的actor的内部状态时才是真的.仅使用未来进行计算,方法是使用创建数据的副本并将管道计算到actor的计算结果pipeTo.一旦actor接收到计算结果,您就可以安全地对其进行操作:
import akka.pattern.pipe
case class ComputationResult(s: String)
def receive = {
case ComputationResult(s) => // modify internal state here
case msg =>
Future {
// Compute here, don't modify state
ComputationResult("finished computing")
}.pipeTo(self)
}
Run Code Online (Sandbox Code Playgroud)