Удалить процессы зомби, используя параллельный пакет - PullRequest
16 голосов
/ 28 февраля 2012

После того, как я какое-то время играл с параллельным пакетом R на моем компьютере с Debian, я все еще не могу найти способ удалить все дочерние процессы зомби после вычислений.

Я ищудля общего и независимого от ОС решения.

Ниже приведен простой скрипт, иллюстрирующий проблему для 2 ядер:

library(parallel)
testfun <- function(){TRUE}

cltype <- ifelse(.Platform$OS.type != "windows", "FORK", "PSOCK")
cl <- makeCluster(2, type = cltype)
p <- clusterCall(cl, testfun)
stopCluster(cl)

К сожалению, этот скрипт оставляет два процесса-зомби в таблице процессов, которые уничтожаются толькоесли R выключен.

Ответы [ 2 ]

6 голосов
/ 01 марта 2012

Это только кажется, проблема с кластерами "FORK".Если вместо этого вы создадите кластер «PSOCK», процессы умрут, когда вы вызовете stopCluster(cl).

Что-нибудь мешает вам использовать кластер «PSOCK» на вашем компьютере с Debian?

4 голосов
/ 29 февраля 2012

Вероятно, ответ вашей проблемы находится в файле справки команды makeCluster().

В нижней части файла написано: Хорошей практикой является отключение рабочих с помощью вызова stopCluster: однако рабочие завершают работу, как только сокет, на котором они слушают команды, становится недоступным, что это должно произойти, если сеанс master R завершен (или его процесс завершен).

Решение (это работает для меня), чтобы определить порт для вашего кластера, пока вы его создаете.

cl <- makeCluster(2, type = cltype,port=yourPortNumber)

Другое (может быть, бесполезное) решение - установить тайм-аут для ваших сокетов. Переменная времени ожидания указана в секундах.

cl <- makeCluster(2, type = cltype,port=yourPortNumber,timeout=50)

В любом случае, цель должна заключаться в том, чтобы сделать подключение к сокету недоступным. Это может сделать либо закрытие портов, либо закрытие основного процесса R.

Редактировать: Я имел в виду закрытие портов, которые слушает процесс. Он должен быть независимым от ОС. Вы можете попробовать использовать -> showConnections(all = TRUE);. Это даст все связи. Тогда вы можете попробовать closeAllConnections();

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

...