У меня есть R API, который использует 5 разных R файлов, которые определяют разные метрики, которые я использую.У каждого из этих файлов есть ряд задач, которые я запускаю с использованием параллельного пакета, поскольку все они используют одни и те же данные, но с разными группировками.Чтобы избежать необходимости создавать и закрывать кластеры в каждом файле, я вынул эти команды и поместил их в файл cluster.R.Таким образом, у меня есть в основном структура:
cluster.R -
cl <- makeCluster(detectCores() - 1)
clusterEvalQ(computeCluster, {
library(‘dplyr’)
source(‘helpers.R’)
})
.Last <- function() {
stopCluster(cl)
}
Metric1.R -
metric1.function <- function(x,y,z) {
dplyr transformations
}
some_date <- date_from_api_input
tasks <- list(job1 = function() {metric1.function(data, grouping1, some_date)},
job2 = function() {metric1.function(data, grouping2, some_date)},
job3 = function() {metric1.function(data, grouping3, some_date)}
)
clusterExport(cl, c('data', 'metric1.function', 'some_date'), envir = environment())
out <- clusterApplyLB(
cl,
tasks,
function(f) f()
)
bind_rows(out)
Этот API просто создаетразличные метрики, которые затем заполняют таблицу базы данных, которая содержит их все.Таким образом, каждый файл метрики содержит разные функции и входные данные, но выводит одинаковые столбцы и группировки.
Метрика 2-5 одинакова, за исключением того, что пользовательская функция отличается для каждого файла и определяется в начале каждого файла.У меня проблема в том, что все метрики также запускаются параллельно, и у меня возникают проблемы при работе со средами.В итоге происходит то, что задание скажет, что some_date не найден или что metric2.function не найдена в metric5.R.
Я использую plumber, чтобы выставить R, и каждый раз, когда он запускается, он получает источникифайл cluster.R, запускает кластеры с их инициализацией и прослушивает любые поступающие запросы.
При последовательной работе он отлично работает для тестирования, и все проходит, как ожидалось, но в работе, когда нашСервер выполняет все сценарии параллельно, переменные и функции, которые я экспортировал в функцию clusterExport, либо не передаются, либо смешиваются.
Должен ли я структурировать его по-другому или я неправильно использую параллельный пакет для своих целей?