Понимание параллели существует и найти

Я беруList[Int] и хотите найти значениеx гдеx * 10 > 500 в параллели. Такexists должен вернутьсяtrue если список содержит любое значение 51 или больше.

def f(x: Int) = {
  println("calculating for " + x)
  Thread.sleep(100 - x)
  println("finished " + x)
  x * 10
}

val res = List.range(1, 100).par.exists(f(_) > 500)

Который дает результаты:

calculating for 1
calculating for 25
calculating for 50
calculating for 75
calculating for 13
finished 75          // <-- first valid result found: 75 * 10 > 500
finished 50
calculating for 51   // but it kicks off more expensive calculations
finished 25
calculating for 26   
finished 13
calculating for 14   
finished 1
calculating for 2
finished 51
finished 26
calculating for 27   // and more
finished 14
calculating for 15
finished 2
calculating for 3
finished 27
calculating for 28
finished 15
calculating for 16
finished 3
calculating for 4    // and more...
finished 28
calculating for 29
finished 16
calculating for 17
finished 29
calculating for 30
finished 4
calculating for 5
finished 17
calculating for 18
finished 30
finished 5
calculating for 6
finished 18
finished 6
res: Boolean = true

Я использую двухъядерный компьютер с Scala 2.9.1.

Что тут происходит? Это работает как задумано? Почему бы просто не отправить сообщение другим потокам, чтобы прервать миссию, как только будет найден первый результат? Это может быть довольно дорого, еслиf это дорогое вычисление.

find похоже, работает аналогичным образом, ища много других значений, хотя в документах говорится, что «элемент не обязательно должен быть первым таким элементом в порядке итерации» и «выбор недетерминирован».

Ответы на вопрос(2)

Ваш ответ на вопрос