zombies procesos proceso huerfano r parallel-processing zombie-process

procesos - proceso huerfano



Elimina procesos zombies usando paquetes paralelos (2)

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

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

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

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

Debajo de un simple script que ilustra el problema para 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)

Desafortunadamente, esta secuencia de comandos deja dos procesos zombie en la tabla de procesos que solo se eliminan si R se apaga.


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

En la parte inferior del archivo, está escrito: es una buena práctica cerrar a los trabajadores llamando a stopCluster: sin embargo, los trabajadores terminarán ellos mismos una vez que el zócalo en el que están escuchando los comandos no esté disponible, lo que debería ocurrir si el maestro R La sesión se completa (o su proceso muere).

La solución es (está funcionando para mí) definir un puerto para su clúster mientras lo está creando.

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

otra solución (puede no ser útil) es establecer un tiempo de espera para sus sockets. La variable timeout está en segundos.

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

En cualquier caso, el objetivo debe ser hacer que la conexión del zócalo no esté disponible, ya que cerrar los puertos o cerrar el proceso R principal haría esto.

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

Lo siento si esto no funciona también.