16

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

4

2 回答 2

7

这似乎只是“FORK”集群的问题。如果您改为创建“PSOCK”集群,则当您调用stopCluster(cl).

有什么东西阻止您在基于 Debian 的机器上使用“PSOCK”集群吗?

于 2012-03-01T15:29:21.413 回答
4

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

在文件的底部,它是这样写的:通过调用 stopCluster 来关闭工作程序是一个好习惯:但是一旦他们正在侦听命令的套接字变得不可用,工作人员将自行终止,如果主 R会话已完成(或其进程终止)。

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

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

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

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

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

编辑:我的意思是关闭进程正在监听的端口。它应该独立于操作系统。您可以尝试使用 -> showConnections(all = TRUE); 。这将提供所有连接。那你可以试试closeAllConnections();

对不起,如果这也不起作用。

于 2012-02-29T14:37:30.273 回答