Я использую функцию pblapply
с аргументом cl
, установленным в целое число вместо объекта кластера. В результате pblapply
вызывает mclapply
вместо parLapply
. Не нужно беспокоиться о том, чтобы таким образом вводить правильные объекты в функцию clusterExport
, что, на мой взгляд, улучшает мой общий рабочий процесс. Однако, если мне нужно вручную прервать вызов pblapply
в RStudio (щелкнув по знаку остановки), сеанс зависает, и я получаю кучу убегающих ядер, которые необходимо вручную убить через терминал.
Обратите внимание, что эта проблема относится только к RStudio; выполнение того же кода из терминала с помощью Rscript
и прерывание вручную с помощью CTRL-C
успешно остановит кластер. Есть ли более изящный и эффективный способ решения этой проблемы, когда он ограничен RStudio?
Вот пример моего решения при работе с parLapply
. Можно ли перевести это на работу с mclapply
вместо?
tryCatch({
cl <- makeCluster(detectCores()-1, "SOCK")
clusterEvalQ(cl, {
library(...) # load necessary libraries to each socket
}
clusterExport(cl, list=c("some_function", "some_list"))
parLapply(cl, some_list, function(x) some_function(x))
stopCluster(cl)
}, error=function(e) {
stopCluster(cl)
return(e)
}, finally = {
try(stopCluster(cl), silent = T)
})
Вот пример использования pblapply
/ mclapply
без обработки исключений.
pblapply(cl = detectCores()-1, some_list, function(x) some_function(x))