2012-02-28 21 views
14

Después de haber jugado durante algún tiempo utilizando el paquete paralelo de R en mi máquina basada en Debian, todavía no puedo encontrar una manera de eliminar todos los procesos secundarios zombies después de un cálculo.Eliminar procesos zombie usando el paquete paralelo

Estoy buscando una solución general y una solución independiente del sistema operativo.

Por debajo de un script sencillo que ilustra el problema de 2 núcleos:

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

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

Por desgracia, este script deja dos procesos de zombies en la tabla de procesos que sólo los matan si R está apagado.

Respuesta

5

Esto solo parece ser un problema con los clústeres "FORK". Si crea un clúster "PSOCK" en su lugar, los procesos morirán cuando llame al stopCluster(cl).

¿Hay algo que le impida utilizar un clúster "PSOCK" en su máquina basada en Debian?

+0

Hola Josh, disculpa mi respuesta tardía: tienes razón, esto solo parece ser un problema para Fork Clusters. Los clústeres de PSOCK también funcionan en mi Debian Machine, simplemente pensé que Forking sería más rápido. ¡Muchas gracias! – user625626

+2

Esto parece ser una tonta supervisión con grupos FORK. Publiqué un informe de errores en https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15471. Los procesos de Zombie son en su mayoría inofensivos porque no consumen recursos. Simplemente están sentados en la mesa de proceso para que el proceso principal pueda examinar su estado de salida. Al examinar su estado de salida con 'library (fork) wait()' limpiará los zombies de a uno por vez (e imprimirá el estado de salida de cada uno). – computermacgyver

+1

El paquete de horquillas ya no está disponible. – russellpierce

2

Probablemente la respuesta de su problema se encuentre en el archivo de ayuda del comando makeCluster().

En la parte inferior del archivo, está escrito: Es una buena práctica cerrar los trabajadores llamando a stopCluster: sin embargo, los trabajadores terminarán ellos mismos una vez que el socket en el que están escuchando los comandos deje de estar disponible, lo cual debería ser si la sesión maestra R se completa (o su proceso muere).

La solución está (me funciona) para definir un puerto para su clúster mientras lo está creando.

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

Otra solución (puede que no sea útil) es establecer un tiempo de espera para sus sockets. la variable de tiempo de espera está en segundos.

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

En cualquier caso, el objetivo debe ser hacer la conexión de socket unavailable.either cerrar los puertos o cerrar el proceso principal R haría esto.

Editar: Lo que quise decir fue cerrar los puertos que está escuchando el proceso. Debería ser un sistema operativo independiente. puede intentar usar ->showConnections(all = TRUE);. Esto dará todas las conexiones. Entonces puedes probar closeAllConnections();

Disculpa si esto no funciona también.

+0

Especificar el número de puerto no funciona para mí en Ubuntu. ¿Qué versión de Debian estás ejecutando? –

+0

En cuanto a su edición: 'stopCluster (cl)' ya cierra los puertos. Eso es lo que hace que los procesos se conviertan en procesos zombies. –

+0

closeAllConnections() Funciona en Windows con hilos PSOCK – myloginid

Cuestiones relacionadas