【问题标题】:Changing ExecutionContext of a Future after initialisation初始化后更改 Future 的 ExecutionContext
【发布时间】:2019-11-16 22:53:20
【问题描述】:

我明白"ExecutionContext is like a cockroach"

我们不能不谈论期货就谈论期货 ExecutionContext:他们形成了一个二人组(不幸的是)......这意味着 ExecutionContext 是在早期(通常在启动时)决定的,并且 因此是固定的。但是呼叫者应该能够决定哪个 ExecutionContext 他们想要运行你的函数(比如使用他们的 自己的)。执行它不是被调用者服务的责任 (例外除外)。

我们必须在构造时将其作为隐式参数传入

object Future {
  def apply[T](body: =>T)(implicit executor: ExecutionContext)
}

如果我们想完全控制任务在哪个线程池中执行,我们应该使用像cats-effect这样的库。

不过,我想知道有什么办法可以破解一个 lazy 初始化的 Future 以使其在与初始化时不同的执行上下文中运行?也许是一些可怕的反光黑魔法,我们以某种方式识别任务并将其从放入的队列中窃取?

例如,假设我们有一个函数接受传递名称Future

def foo(f: => Future) = {
  val differentExecutionContext = ExecutionContext.fromExecutor(...
  /* run f on differentExecutionContext */
}

foo(Future(42)(ExecutionContext.Implicits.global))

现在我们可以做的是在调用站点使用不同的执行上下文,像这样

val differentExecutionContext = ExecutionContext.fromExecutor(...
foo(Future(42)(differentExecutionContext))

但是,这会迫使用户记住提供和使用不同的执行上下文。 Future(42) 有什么办法可以在 differentExecutionContext 上运行 foo 而不是 global,对用户透明?

如果这是 XY 问题,这里是 context

【问题讨论】:

    标签: scala future


    【解决方案1】:

    不认为这是可能的。在黑客攻击方面,=> Future[T]Future[T] 无法区分。我想你想做这样的事情:

    f.asInstanceOf[SomeImplOfFuture[T]].setExecutionContext(myContexty).

    但任何此类操作都会触发f的执行。

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 2021-03-24
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      相关资源
      最近更新 更多