使用并行包删除僵尸进程

时间:2012-02-28 17:39:09

标签: r parallel-processing zombie-process

在我使用基于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关闭时才会被杀死。

2 个答案:

答案 0 :(得分:6)

这似乎只是“FORK”群集的一个问题。如果您改为创建“PSOCK”群集,则在致电stopCluster(cl)时,流程将会消失。

是否有任何因素阻止您在基于Debian的计算机上使用“PSOCK”群集?

答案 1 :(得分:3)

问题的答案可能在makeCluster()命令的帮助文件中。

在文件的底部,写着:最好通过调用stopCluster来关闭worker:但是一旦他们正在侦听命令的套接字变得不可用,worker会自行终止,如果主R会话已完成(或其进程终止),则应该这样做。

解决方案是(它对我有用)在创建集群时为其定义端口。

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

另一个(可能没用)解决方案是为套接字设置超时。超时变量以秒为单位。

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

在任何情况下,目标应该是使套接字连接不可用。关闭端口或关闭主R进程都会这样做。

编辑:我的意思是关闭进程正在侦听的端口。它应该是OS独立的。你可以尝试使用 - &gt; showConnections(all = TRUE);。这将提供所有连接。然后,您可以尝试closeAllConnections();

很抱歉,如果这也不起作用。