0

如何仅从特定内部运行方法ExecutionContext

例如,考虑以下代码:

trait SomeTrait {
  private var notThreadSafe = 0  // mutable var!
  def add(i: Int) = ???
  def subtract(i: Int) = ???
}

此代码仅在方法正确addsubtract仅从同一线程调用时才是正确的。有什么方法可以使这些方法始终使用特定的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:使用一个akkaactor,将所有方法转换为传入的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

那么......有没有简单的方法可以做到这一点?

4

0 回答 0