|
| 1 | +--- |
| 2 | +layout: overview-large |
| 3 | +title: Конфигурирование параллельных коллекций |
| 4 | + |
| 5 | +disqus: true |
| 6 | + |
| 7 | +partof: parallel-collections |
| 8 | +language: ru |
| 9 | +num: 7 |
| 10 | +--- |
| 11 | + |
| 12 | +## Обслуживание задач |
| 13 | + |
| 14 | +Параллельные коллекции предоставляют возможность выбора методов планирования задач при выполнении операций. В числе параметров каждой параллельной коллекции есть так называемый объект обслуживания задач, который и отвечает за планирование и распределение нагрузки на процессоры. |
| 15 | + |
| 16 | +Внутри объект обслуживания задач содержит ссылку на реализацию пула потоков; кроме того он определяет, как и когда задачи разбиваются на более мелкие подзадачи. Подробнее о том, как конкретно происходит этот процесс, можно узнать в техническом отчете \[[1][1]\]. |
| 17 | + |
| 18 | +В настоящее время для параллельных коллекций доступно несколько реализаций объекта поддержки задач. Например, `ForkJoinTaskSupport` реализован посредством "fork-join" пула и используется по умолчанию на JVM 1.6 или более поздних. Менее эффективный `ThreadPoolTaskSupport` является резервом для JVM 1.5 и тех машин, которые не поддерживают пулы "fork-join". `ExecutionContextTaskSupport` берет реализацию контекста исполнения по умолчанию из `scala.concurrent`, и использует тот же пул потоков, что и `scala.concurrent` (в зависимости от версии JVM, это может быть пул "fork-join" или "thread pool executor"). По умолчанию каждой параллельной коллекции назначается именно обслуживание задач контекста выполнения, поэтому параллельные коллекции используют тот же пул "fork-join", что и API объектов "future". |
| 19 | + |
| 20 | +Сменить метод обслуживания задач для параллельной коллекции можно так: |
| 21 | + |
| 22 | + scala> import scala.collection.parallel._ |
| 23 | + import scala.collection.parallel._ |
| 24 | + |
| 25 | + scala> val pc = mutable.ParArray(1, 2, 3) |
| 26 | + pc: scala.collection.parallel.mutable.ParArray[Int] = ParArray(1, 2, 3) |
| 27 | + |
| 28 | + scala> pc.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(2)) |
| 29 | + pc.tasksupport: scala.collection.parallel.TaskSupport = scala.collection.parallel.ForkJoinTaskSupport@4a5d484a |
| 30 | + |
| 31 | + scala> pc map { _ + 1 } |
| 32 | + res0: scala.collection.parallel.mutable.ParArray[Int] = ParArray(2, 3, 4) |
| 33 | + |
| 34 | +Приведенное выше настраивает параллельную коллекцию на использование "fork-join" пула с уровнем параллелизма равным 2. Заставить коллекцию использовать "thread pool executor" можно так: |
| 35 | + |
| 36 | + scala> pc.tasksupport = new ThreadPoolTaskSupport() |
| 37 | + pc.tasksupport: scala.collection.parallel.TaskSupport = scala.collection.parallel.ThreadPoolTaskSupport@1d914a39 |
| 38 | + |
| 39 | + scala> pc map { _ + 1 } |
| 40 | + res1: scala.collection.parallel.mutable.ParArray[Int] = ParArray(2, 3, 4) |
| 41 | + |
| 42 | +Когда параллельная коллекция сериализуется, поле объекта обслуживания задач исключается из сериализуемых. Когда параллельная коллекция восстанавливается из полученной последовательности байт, это поле приобретает значение по умолчанию-- способ обслуживания задач контекста выполнения. |
| 43 | + |
| 44 | +Чтобы реализовать собственный механизм поддержки задач, достаточно расширить трейт `TaskSupport` и реализовать следующие методы: |
| 45 | + |
| 46 | + def execute[R, Tp](task: Task[R, Tp]): () => R |
| 47 | + |
| 48 | + def executeAndWaitResult[R, Tp](task: Task[R, Tp]): R |
| 49 | + |
| 50 | + def parallelismLevel: Int |
| 51 | + |
| 52 | +Метод `execute` планирует асинхронное выполнение задачи и возвращает "future" в качестве ссылки к будущему результату выполнения. Метод `executeAndWait` делает то же самое, но возвращает результат только после завершения задачи. Метод `parallelismLevel` просто возвращает предпочитаемое количество ядер, которые обслуживание задач использует для планирования заданий. |
| 53 | + |
| 54 | +## Ссылки |
| 55 | + |
| 56 | +1. [On a Generic Parallel Collection Framework, June 2011][1] |
| 57 | + |
| 58 | + [1]: http://infoscience.epfl.ch/record/165523/files/techrep.pdf "parallel-collections" |
0 commit comments