Skip to content

Commit a00cedc

Browse files
a most difficult subpart
1 parent 899f850 commit a00cedc

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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

Comments
 (0)