如何强制在`ExecutionContext`中运行方法?

时间:2017-09-01 13:12:26

标签: scala future scala-macros executioncontext

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

例如,请考虑以下代码:

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

只有从同一个线程调用方法addsubtract时,此代码才正确。有哪些方法可以使这些方法始终使用特定的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

那么......有一种简单的方法吗?

0 个答案:

没有答案