Подтвердить что ты не робот

Удаление процессов зомби с использованием параллельного пакета

После того, как я некоторое время играл с 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 выключен.

4b9b3361

Ответ 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();

Извините, если это тоже не работает.