Изменение ExecutionContext будущего после инициализации - PullRequest
1 голос
/ 07 июля 2019

Я понимаю "ExecutionContext - это как таракан" :

Мы не можем говорить о Futures, не говоря о его 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, здесь контекст .

1 Ответ

1 голос
/ 07 июля 2019

Не думай, что это возможно.=> Future[T] неотличим от Future[T], когда дело доходит до взлома.Я полагаю, вы хотели бы сделать что-то вроде этого:

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

Но любое такое действие вызовет выполнение f.

...