Изящно останавливать кластер mclapply при ручном прерывании в RStudio? - PullRequest
0 голосов
/ 12 января 2019

Я использую функцию 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))
...