Понимание существования параллельности и find

Я беру List [Int] и хочу найти значение x , где x * 10> 500 параллельно. Таким образом, существует должен возвращать 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 , похоже, работает аналогичным образом, ища гораздо больше значений, даже несмотря на то, что в документации говорится, что элемент "может не обязательно быть первым таким элементом в порядке итерации »и« выбор недетерминированный ».

9
задан Luigi a.k.a. Rhys 12 December 2011 в 05:06
поделиться