【发布时间】: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。
【问题讨论】: