Ответ 1
Красота mclapply
в том, что рабочие процессы все созданы как клоны мастера прямо в точке, что mclapply
называется, так что вам не придется беспокоиться о воспроизведении среды на каждом кластере работников. К сожалению, это невозможно в Windows.
При использовании parLapply
вам обычно необходимо выполнить следующие дополнительные шаги:
- Создание кластера PSOCK
- При необходимости зарегистрируйте кластер
- Загрузите необходимые пакеты для сотрудников кластера.
- Экспорт необходимых данных и функций в глобальную среду рабочих групп.
Кроме того, когда все будет готово, рекомендуется отключить кластер PSOCK с помощью stopCluster
.
Здесь перевод вашего примера на parLapply
:
library(parallel)
cl <- makePSOCKcluster(4)
setDefaultCluster(cl)
adder <- function(a, b) a + b
clusterExport(NULL, c('adder'))
parLapply(NULL, 1:8, function(z) adder(z, 100))
Если вашей функции adder
требуется пакет, вам придется загрузить этот пакет для каждого из рабочих, прежде чем называть его parLapply
. Вы можете сделать это довольно легко с помощью clusterEvalQ
:
clusterEvalQ(NULL, library(MASS))
Обратите внимание, что NULL
Первый аргумент clusterExport
, clusterEval
и parLapply
указывает на то, что они должны использовать объект кластера, зарегистрированный с помощью setDefaultCluster
. Это может быть очень полезно, если ваша программа использует mclapply
во многих различных функциях, так что вы не должны передавать объект кластера для каждой функции, которая нуждается в ней при преобразовании программы использовать parLapply
.
Конечно, adder
может вызывать другие функции в вашей глобальной среде, которые вызывают другие функции и т.д. В этом случае вам также придется экспортировать их и загрузить любые необходимые им пакеты. Также обратите внимание, что если любые переменные, которые вы экспортировали, меняются в ходе вашей программы, вам придется экспортировать их снова, чтобы обновить их у сотрудников кластера. Опять же, это необязательно с mclapply
, потому что он всегда создает/клонирует/разворачивает рабочих каждый раз, когда он вызывается, делая это ненужным.