2012-02-28 71 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