在我基于Debian的机器上使用R的并行软件包玩了一段时间后,我仍然无法找到一种方法来在计算后删除所有僵尸子进程.
我正在寻找一个通用的OS独立解决方案.
下面是一个简单的脚本,说明了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关闭时才会被杀死.
doMC的文档似乎非常稀疏,仅列出了doMC-package和registerDoMC().我遇到的问题是我会通过doMC/foreach产生几个工作者,但是当工作完成后,他们只是坐在那里占用内存.我可以去寻找他们的进程ID,但我经常意外地杀死主进程.
library(doMC)
library(foreach)
registerDoMC(32)
foreach(i=1:32) %dopar% foo()
##kill command here?
我试过跟随registerDoSEQ(),但它似乎没有杀掉进程.
这是一个可重复的例子:
library(doMC)
library(doParallel)
registerDoMC(4)
    timing <- system.time( fitall <- foreach(i=1:1000, .combine = "c") %dopar% {
                print(i)
            })
我启动R并查看进程表:
> system("ps -efl")
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S chbr         1     0  5  80   0 - 21399 wait   10:58 ?        00:00:00 /usr/local/lib/R/bin/exec/R --no-save --no-restore
0 S chbr         9     1  0  80   0 -  1113 wait   10:58 ?        00:00:00 sh -c ps -efl
0 R chbr        10     9  0  80 …