2012-02-28 73 views
14

在基於Debian的機器上使用R的並行程序包玩了一段時間後,我仍然無法找到一種方法在計算後刪除所有殭屍子進程。使用並行程序包刪除殭屍進程

我正在尋找一個通用和獨立於操作系統的解決方案。

下面說明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被關閉,只有被殺的進程表中的兩個殭屍進程。

回答

5

這似乎只是「FORK」羣集的問題。如果您改爲創建「PSOCK」羣集,則當您撥打stopCluster(cl)時,進程將會死亡。

是否有任何東西阻止您在基於Debian的計算機上使用「PSOCK」羣集?

+0

嗨喬希,對不起,我遲到的回覆 - 你是對的,這似乎只是叉集羣的問題。 PSOCK羣集也在我的Debian機器上工作 - 只是認爲Forking會更快。非常感謝! – user625626 2012-03-05 19:02:52

+2

這似乎是FORK羣集的一個愚蠢的疏忽。我在https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15471上發佈了一個錯誤報告。殭屍進程大多是無害的,因爲它們不消耗資源。他們只是坐在流程表中,以便父進程可以檢查其退出狀態。用'library(fork)wait()'檢查它們的退出狀態將一次清理一個殭屍(並打印每個殭屍的退出狀態)。 – computermacgyver 2013-09-24 07:33:57

+1

叉包不再可用。 – russellpierce 2015-05-27 12:09:28

2

可能您的問題的答案在makeCluster()命令的幫助文件中。

在文件的底部寫着:通過調用stopCluster關閉工作人員是一種很好的做法:但是,一旦他們正在偵聽命令的套接字變得不可用,工作人員就會自行終止,如果主R會話完成(或其進程死亡)。

解決方案是(它正在爲我工​​作)在創建羣集時爲您的羣集定義一個端口。

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

另一個(可能不是有用的)解決方案是爲您的套接字設置超時。超時變量以秒爲單位。

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

在任何情況下,目的應該是使插座連接unavailable.either關閉所述端口或關閉主要研發過程將執行此操作。

編輯:我的意思是關閉進程正在監聽的端口。它應該與操作系統無關。你可以嘗試使用 - >showConnections(all = TRUE);。這將給所有的連接。那麼你可以試試closeAllConnections();

對不起,如果這也行不通。

+0

在Ubuntu上指定端口號對我無效。你運行的是哪個版本的Debian? – 2012-03-01 14:59:52

+0

關於您的編輯:'stopCluster(cl)'已經關閉端口。這就是導致進程成爲殭屍進程的原因。 – 2012-03-01 16:18:49

+0

closeAllConnections()在Windows上與PSOCK線程一起工作 – myloginid 2015-12-03 08:28:49