Ожидание списка фьючерсов VS Ожидание отдельных фьючерсов - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь понять плюсы и минусы - если таковые имеются - следующих двух подходов

  def doSomething(): Future[Unit] = ???
  
  // Create one big list of futures and wait on this future
  private val oneBigFuture: Future[immutable.IndexedSeq[Unit]] = Future.sequence {
    (1 to 1000).map(_ => doSomething)
  }

  Await.result(oneBigFuture, 10.seconds)

  // Wait on the individual futures created by the doSomething() method
  (1 to 1000).foreach {
    _ =>
      val individualFuture = doSomething()
      Await.result(individualFuture, 10.seconds)
  }

Какая польза от создания одного большого списка фьючерсов и отправки его методу result вместо отправки отдельных Future s, созданных методом doSomething(), методу result?

Очевидно, что первый подход создает пакетную операцию, но я не уверен, преобразует ли компилятор второй подход в также пакетная операция - поскольку она обернута вокруг оператора foreach.

1 Ответ

2 голосов
/ 10 июля 2020

Первый подход должен быть намного быстрее, потому что все Future запускаются до того, как произойдет блокировка, в то время как во втором подходе блокировка происходит перед каждым следующим запуском Future. Вы можете проверить это следующим образом:

def doSomething(): Future[Unit] = Future { Thread.sleep(1000); println(1) }

, где

Await.result(Future.sequence((1 to 10).map(_ => doSomething())), Duration.Inf)

займет около секунды, а

(1 to 10).foreach(_ => Await.result(doSomething(), Duration.Inf))

займет около 10 секунд.

...