Карта будущего ленива или нет? - PullRequest
0 голосов
/ 03 ноября 2018

В основном я имею в виду:

for(v <- Future(long time operation)) yield v*someOtherValue

Это выражение возвращает еще один Future, но вопрос в том, является ли операция v*someOhterValue ленивой или нет? Будет ли это выражение блокироваться при получении значения Future(long time operation)?

Или это как цепочка обратных вызовов?

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Карта (или, что эквивалентно, ваша для понимания) в Future не ленивая: она будет выполнена как можно скорее в другом потоке. Однако, поскольку он работает в другом потоке, он также не блокируется.

0 голосов
/ 03 ноября 2018

Если вы хотите сделать определение и исполнение Будущего отдельно, тогда вы должны использовать что-то вроде Monix Task.

https://monix.io/api/3.0/monix/eval/Task.html

0 голосов
/ 03 ноября 2018

Короткий эксперимент может проверить этот вопрос.

import concurrent._;
import concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

object TheFuture {

  def main(args: Array[String]): Unit = {
    val fut = for (v <- Future { Thread.sleep(2000) ; 10 }) yield v * 10;
    println("For loop is finished...")
    println(Await.ready(fut, Duration.Inf).value.get);
  }

}

Если мы запустим это, мы увидим For loop is finished... почти сразу, а затем через две секунды мы увидим результат. Таким образом, акт выполнения map или подобных операций над будущим не блокирует.

...