Паралельные коллекции¶
Параллельная библиотека избегает повторений кода путем реализации большинства операций посредством собственных “шаблонов”, которые достаточно объявить один раз, а потом наследовать в различных реализациях параллельных коллекций.
Упомянутые выше “шаблонные” трейты реализуют большинство параллельных операций в терминах двух ключевых абстракций – разделителей (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 оба компоновщика становятся недействительными.