如何仅从特定内部运行方法ExecutionContext
?
例如,考虑以下代码:
trait SomeTrait {
private var notThreadSafe = 0 // mutable var!
def add(i: Int) = ???
def subtract(i: Int) = ???
}
此代码仅在方法正确add
且subtract
仅从同一线程调用时才是正确的。有什么方法可以使这些方法始终使用特定的ExecutionContext
(如果 EC 中只有 1 个工人,这将是有意义的)?有什么简单的方法吗?
为了掌握这个问题,这里有一些示例答案:
答案 1:将所有方法的主体包装在 中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一起工作。如果你不是故意搞砸的,所有的方法都会从你的actor-s 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。
那么......有没有简单的方法可以做到这一点?