сравнивать с результатами foreach в произвольном порядке, но не с картой - PullRequest
0 голосов
/ 22 января 2020

Я только что прошел метод par и обнаружил, что с foreach это приводит к последовательности в случайном порядке, но это не тот же случай с map.

Я знаю, что par использует какой-то алгоритм для достижения параллельных вычислений, но почему тогда этого не происходит с картой

scala> val petnames = Seq("tiger", "coco", "mini", "dora","dodo", "momo", "cod", "neo", "simbha", "dante")
scala> petnames.par.foreach( x => println(x.capitalize))
Neo
Cod
Coco
Mini
Dante
Momo
Dora
Tiger
Dodo
Simbha
scala> println(petnames.par.map(_.capitalize))
ParVector(Tiger, Coco, Mini, Dora, Dodo, Momo, Cod, Neo, Simbha, Dante)

1 Ответ

2 голосов
/ 22 января 2020

Концептуально мы различаем временной и пространственный порядок. Параллельные коллекции выполняют операции не по порядку во временном смысле, однако в пространственном смысле они по порядку. Ssemantics состояние

Побочные операции могут привести к недетерминизму

foreach принимает побочную операцию println, следовательно Эффект, скорее всего, будет выполнен «вне очереди». Обратите внимание, что побочные эффекты не имеют «структуры», они просто происходят. С другой стороны, List[T] имеет структуру, а map пинг по списку является структурно-настойчивой операцией. Таким образом,

Семантика «не по порядку» параллельных коллекций означает только то, что операция будет выполняться не по порядку (во временном смысле, то есть не последовательно), это не означает, что результат будет «объединен» не по порядку (в пространственном смысле). Напротив, результаты, как правило, всегда будут повторно собраны в порядке, то есть параллельный набор, разбитый на разделы A, B, C, в этом порядке, будет снова собран в порядке A, B, C. Не какой-то другой произвольный порядок, как B, C, A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...