Entfernen zombie-Prozesse mit parallel-Paket
Nachdem ich gespielt habe, um für einige Zeit mit R Paket parallel auf meinem Debian-basierte Maschine, die ich noch nicht finden können, ein Weg, um entfernen Sie alle zombie child-Prozesse nach einer Berechnung.
Ich bin auf der Suche für eine Allgemeine und OS-unabhängige Lösung.
Unten ein einfaches Skript illustriert das problem für 2 Kerne:
library(parallel)
testfun <- function(){TRUE}
cltype <- ifelse(.Platform$OS.type != "windows", "FORK", "PSOCK")
cl <- makeCluster(2, type = cltype)
p <- clusterCall(cl, testfun)
stopCluster(cl)
Leider dieses Skripts lässt zwei zombie-Prozesse in der Prozesstabelle, die nur getötet werden, wenn R ist heruntergefahren.
- Sie sind keine zombies, Sie sind nur Arbeitslose Kinder
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies scheint nur ein Problem mit "GABEL" - Cluster. Wenn Sie eine "PSOCK" cluster statt, das Verfahren wird sterben, wenn Sie anrufen
stopCluster(cl)
.Ist es etwas, das Sie daran hindern, eine "PSOCK" cluster auf Ihrem Debian-basierten Rechner?
library(fork) wait()
reinigen Sie die zombies ein zu einer Zeit (und drucken der exit-status von jedem).Wohl die Antwort auf Ihr problem ist in der Hilfe-Datei von
makeCluster()
Befehl.Unten in der Datei, es steht geschrieben : Es ist gute Praxis, um ein Herunterfahren der Arbeitnehmer durch den Aufruf stopCluster: aber der Arbeiter wird beendet sich selbst, sobald der sockel, auf dem Sie sind empfangsbereit für Befehle nicht mehr verfügbar ist, die es sollte, wenn der master R-Sitzung abgeschlossen ist (oder seinen Prozess stirbt).
Die Lösung ist (es ist für mich arbeiten) definieren Sie einen port für Ihren cluster während Sie Sie erstellen.
einem anderen (möglicherweise nicht nützlich) - Lösung ist eine timeout-Einstellung für Ihre Steckdosen. timeout-variable wird in Sekunden angegeben.
In jedem Fall sollte es das Ziel sein, um die socket-Verbindung nicht verfügbar.entweder schließen der ports oder Schließung der wichtigsten R-Prozess würde dies zu tun.
Edit: Was ich meinte, war zum schließen der ports, die der Prozess empfangsbereit ist. Es sollte OS unabhängig. Sie können versuchen, zu verwenden ->
showConnections(all = TRUE);
. Diese geben allen verbindungen. Dann können Sie versuchencloseAllConnections();
Sorry, wenn das nicht funktioniert, auch.
stopCluster(cl)
schon schließt die ports. Das ist, was bewirkt, dass die Prozesse zu zombie-Prozesse.