Паралельные коллекции

Параллельная библиотека избегает повторений кода путем реализации большинства операций посредством собственных “шаблонов”, которые достаточно объявить один раз, а потом наследовать в различных реализациях параллельных коллекций.

Упомянутые выше “шаблонные” трейты реализуют большинство параллельных операций в терминах двух ключевых абстракций – разделителей (Splitter) и компоновщиков (Combiner).

Note

CollectionConverters.

_.par - Преобразование последовательной коллекции в паралельную

_.seq - Преобразование кололекции в последовательную версию

Splitter (Аналог Spliterator)

Задача разделителя (trait Splitter[T] extends Iterator[T]), как и предполагает имя, заключается в том, чтобы разбить параллельную коллекцию на непустые разделы. А основная идея – в том, чтобы разбивать коллекцию на более мелкие части, пока их размер не станет подходящим для последовательной обработки.

Уникальность этого “разделяющего итератора” в том, что его метод split разбивает текущий объект this на другие разделители Splitter, каждый из которых перебирает свой, отделенный набор элементов когда-то целой параллельной коллекции. И так же, как любой нормальный Iterator, Splitter становится недействительным после того, как вызван его метод split.

В случаях, когда требуются разделы произвольного размера, особенно в параллельных последовательностях, используется PreciseSplitter, который является наследником Splitter и дополнительно реализует точный метод разделения, psplit.

Combiner

Компоновщик Combiner можно представить себе как обобщенный Builder из библиотеки последовательных коллекций Scala. У каждой параллельной коллекции есть свой отдельный Combiner, так же, как у каждой последовательной есть свой Builder.

Если в случае с последовательными коллекциями элементы можно добавлять в Builder, а потом получить коллекцию, вызвав метод result, то при работе с параллельными требуется вызвать у компоновщика метод combine, который берет аргументом другой компоновщик и делает новый Combiner. Результатом будет компоновщик, содержащий объединенный набор. После вызова метода combine оба компоновщика становятся недействительными.

Реализации

ParArray

ParVector

mutable.ParHashMap

mutable.ParHashSet

immutable.ParHashMap

immutable.ParHashSet

ParRange

ParTrieMap