Как параллельные коллекции Scala 2.9 работают за кулисами? - PullRequest
28 голосов
/ 13 июня 2011

Scala 2.9 представила параллельные коллекции. Они действительно отличный инструмент для определенных задач. Тем не менее, как они работают внутри, и могу ли я влиять на поведение / конфигурацию?

Какой метод они используют, чтобы определить оптимальное количество потоков? Если я не удовлетворен результатом, есть ли какие-либо параметры конфигурации для настройки?

Мне не только интересно, сколько потоков на самом деле создано, меня также интересует, как фактическая работа распределяется между ними. Как собираются результаты и как много магии происходит за кулисами. Проверяет ли Scala, является ли коллекция достаточно большой, чтобы получить выгоду от параллельной обработки?

1 Ответ

29 голосов
/ 13 июня 2011

Вкратце, есть два ортогональных аспекта того, как ваши операции распараллеливаются:

  1. Степень, в которой ваша коллекция разбивается на куски (т.е. размер кусков) для распараллеливаемой операции (например, map или filter)
  2. Количество потоков, используемых для базового пула fork-join (для которого выполняются параллельные задачи)

Для # 2 это управляется самим пулом, который обнаруживает «идеальный» уровень параллелизма во время выполнения (см. java.lang.Runtime.getRuntime.availableProcessors)

Для # 1 это отдельная проблема, и API параллельных коллекций Scala делает это через концепцию похищения работ ( адаптивное планирование ). То есть, когда определенная часть работы выполнена, работник попытается украсть работу из других рабочих очередей. Если ни один из них не доступен, это свидетельствует о том, что все процессоры очень заняты, и, следовательно, следует выполнить большую часть работы.

Александр Прокопец, который внедрил библиотеку, выступил с докладом на ScalaDays этого года, который скоро будет онлайн. Он также дал отличный доклад на ScalaDays2010 , где он подробно описывает, как операции разделяются и объединяются (есть ряд проблем, которые не сразу очевидны, и некоторые приятные моменты и там сообразительности!).

Более подробный ответ доступен в PDF, описывающем API параллельных коллекций .

...