В вашем коде фактическая параллельная рабочая нагрузка не обрабатывается future
, а snow::parLapply
. Вы можете увидеть это в следующем примере, где я использую parallel
вместо snow
, что я бы посчитал устаревшим для простых кластеров PSOCK:
RunNM2 <- function(index){
Sys.sleep(4)
return(index)
}
library(tictoc)
library(parallel)
cl <- makePSOCKcluster(rep("localhost",8))
tic("cluster")
res <- parLapply(cl,1:8,RunNM2)
toc()
#> cluster: 4.015 sec elapsed
stopCluster(cl)
rm(cl)
Создано в 2019-06-04 пакетом Представления (v0.3.0)
Итак, в настоящее время вы создаете одно будущее из результата ваших параллельных вычислений. Вместо этого вы должны создать несколько фьючерсов, которые затем будут оцениваться параллельно:
RunNM2 <- function(index){
Sys.sleep(4)
return(index)
}
library(tictoc)
library(future)
cl <- makeClusterPSOCK(rep("localhost",8))
plan(cluster, workers = cl)
tic("cluster")
res.1 <- lapply(1:8, function(index) future(RunNM2(index)))
res <- values(res.1)
# blocks here
toc()
#> cluster: 4.66 sec elapsed
parallel::stopCluster(cl)
rm(cl)
Создано в 2019-06-04 пакетом представ. (v0.3.0)
Примечание. Согласно ?cluster
предпочтительный способ создания ClusterFuture
- future()
или %<-%
после регистрации подходящего (кластерного) плана для выполнения.