Подтвердить что ты не робот

Можно ли использовать представления с параллельными коллекциями?

Идиома для нахождения результата в отображении коллекции выглядит примерно так:

list.view.map(f).find(p)

где list является List[A], f является A => B, а p является B => Boolean.

Можно ли использовать view с параллельными коллекциями? Я спрашиваю, потому что я получаю очень странные результаты:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val f : Int => Int = i => {println(i); i + 10}
f: Int => Int = <function1>

scala> val list = (1 to 10).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list.par.view.map(f).find(_ > 5)
1
res0: Option[Int] = Some(11)

scala> list.par.view.map(f).find(_ > 5)
res1: Option[Int] = None
4b9b3361

Ответ 1

См. "Общая схема параллельных вычислений" , статья Мартина Одерски и др., в которой обсуждаются новые параллельные коллекции. На странице 8 есть раздел "Параллельные представления", в котором рассказывается о том, как view и par могут использоваться вместе и как это может дать преимущества производительности обоих представлений и параллельных вычислений.

Что касается вашего конкретного примера, это определенно ошибка. Метод exists также ломается, и его разрыв в одном списке разбивает его на все остальные списки, поэтому я думаю, что это проблема, когда операции, которые могут быть прерваны частично (find и exists, могут останавливаться после есть ответ) каким-то образом удается сломать пул потоков. Это может быть связано с ошибкой с исключениями, возникающими внутри функций, переданных в параллельные коллекции. Если это так, оно должно быть исправлено в 2.10.