Используйте
autoStopCluster <- function(cl) {
stopifnot(inherits(cl, "cluster"))
env <- new.env()
env$cluster <- cl
attr(cl, "gcMe") <- env
reg.finalizer(env, function(e) {
message("Finalizing cluster ...")
message(capture.output(print(e$cluster)))
try(parallel::stopCluster(e$cluster), silent = FALSE)
message("Finalizing cluster ... done")
})
cl
}
, а затем настройте кластер как:
cl <- autoStopCluster(makeCluster(n_c))
Старые объекты кластера, которые более недоступны, будут автоматически остановлены при сборе мусора. Вы можете запустить сборщик мусора, вызвав gc()
. Например, если вы звоните:
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
gc()
и наблюдайте за монитором процессов вашей ОС, вы увидите, как запускается много рабочих, но в конечном итоге, когда сборщик мусора запускается, остается только самый последний набор работников кластера.
РЕДАКТИРОВАТЬ 2018-09-05: Добавлены выходные сообщения отладки, которые отображаются при запуске зарегистрированного финализатора, что происходит при запуске сборщика мусора. Удалите эти message()
строки и используйте silent = TRUE
, если хотите, чтобы он был совершенно бесшумным.