Удаление процессов зомби с использованием параллельного пакета
После того, как я некоторое время играл с R-параллельным пакетом на моем компьютере на базе Debian, я все еще не могу найти способ удалить все дочерние процессы zombie после вычисления.
Я ищу общее и независимое от ОС решение.
Ниже простого script, иллюстрирующего проблему для двух ядер:
library(parallel)
testfun <- function(){TRUE}
cltype <- ifelse(.Platform$OS.type != "windows", "FORK", "PSOCK")
cl <- makeCluster(2, type = cltype)
p <- clusterCall(cl, testfun)
stopCluster(cl)
К сожалению, этот script оставляет два процесса зомби в таблице процессов, которые только убиваются, если R выключен.
Ответы
Ответ 1
Это только кажется проблемой для кластеров "FORK". Если вместо этого вы создадите кластер "PSOCK", процессы будут умирать при вызове stopCluster(cl)
.
Есть ли что-либо, препятствующее вам использовать кластер "PSOCK" на вашей машине на базе Debian?
Ответ 2
Вероятно, ответ вашей проблемы находится в файле справки команды makeCluster()
.
В нижней части файла написано: Хорошая практика заключается в том, чтобы закрыть рабочих, вызвав stopCluster: однако работники завершатся, как только сокет, на котором они прослушивают команды, становится недоступным, что должно быть, если завершается мастер-сеанс (или его процесс умирает).
Решение (оно работает для меня) определяет порт для вашего кластера при его создании.
cl <- makeCluster(2, type = cltype,port=yourPortNumber)
другое (может быть не полезно) решение устанавливает тайм-аут для ваших сокетов. timeout изменяется в секундах.
cl <- makeCluster(2, type = cltype,port=yourPortNumber,timeout=50)
В любом случае, цель должна заключаться в том, чтобы сделать соединение сокета недоступным. Либо закрытие портов, либо закрытие основного процесса R сделало бы это.
Изменить: я имел в виду закрыть порты, которые прослушивает этот процесс. Он должен быть независимым от ОС. вы можете попробовать использовать → showConnections(all = TRUE);
. Это даст все соединения. Затем вы можете попробовать closeAllConnections();
Извините, если это тоже не работает.