如何仅从特定ExecutionContext
内部运行方法?
例如,请考虑以下代码:
trait SomeTrait {
private var notThreadSafe = 0 // mutable var!
def add(i: Int) = ???
def subtract(i: Int) = ???
}
只有从同一个线程调用方法add
和subtract
时,此代码才正确。有哪些方法可以使这些方法始终使用特定的ExecutionContext
(如果EC中只有1个工作人员,这将是有意义的)?有什么简单的方法吗?
为了掌握这个问题,以下是一些示例答案:
Answer1 :在Future.apply
中包装所有方法的正文,如下所示:
class SomeClass {
private implicit val ec: ExecutionContext = ???
private var notThreadSafe = 0
def add(i: Int) = Future {
???
}
def subtract(i: Int) = Future {
???
}
}
Answer2 :使用akka
actor,将所有方法转换为传入的actor消息,并使用ask模式处理actor。如果你没有故意搞砸,所有方法都将从你的演员EC中运行。
答案3 :也许写一个将特征转换为其未来化版本的宏功能?就像扩展这段代码一样:
MyTrickyMacro.futurize(underlying: SomeTrait)(ec)
到此:
class MacroGeneratedClass(underlying: SomeTrait)(implicit ec: ExecutionContext) {
def add(i: Int) = Future(underlying.add(i))
def subtract(i: Int) = Future(underlying.subtract(i))
}
现在,我认为 Answer1 一般都可以,但容易出错和一些样板。 Answer2 仍然需要编写样板代码,强制您创建案例类以包含函数参数并需要akka。我没有看到任何实施 Answer3 。
那么......有一种简单的方法吗?