如何阻止R留下僵尸进程

主垃圾

这是一个可重现的示例:

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   0 -  4294 -      10:58 ?        00:00:00 ps -efl

如果我使用上述简单的for循环doMCdoParallel留下僵尸进程。ps -efl运行循环后的输出

> system("ps -efl")
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S chbr         1     0  4  80   0 - 25256 wait   11:00 ?        00:00:00 /usr/local/lib/R/b
1 Z chbr        10     1  0  80   0 -     0 exit   11:00 ?        00:00:00 [R] <defunct>
0 S chbr        12     1  0  80   0 -  1113 wait   11:00 ?        00:00:00 sh -c ps -efl
0 R chbr        13    12  0  80   0 -  4294 -      11:00 ?        00:00:00 ps -efl

如果我重复循环而不registerDoMC(4)再次发出,则不会创建其他僵尸进程。但是,如果我发出registerDoMC(4)一个附加的僵尸进程,则会被创建:

> system("ps -efl")
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S chbr         1     0  0  80   0 - 25554 wait   11:00 ?        00:00:01 /usr/local/lib/R/b
1 Z chbr        21     1  0  80   0 -     0 exit   11:02 ?        00:00:00 [R] <defunct>
1 Z chbr        22     1  0  80   0 -     0 exit   11:02 ?        00:00:00 [R] <defunct>
0 S chbr        26     1  0  80   0 -  1113 wait   11:03 ?        00:00:00 sh -c ps -efl
0 R chbr        27    26  0  80   0 -  4294 -      11:03 ?        00:00:00 ps -efl

我就是这么想的,doMC这是在做不应做的事情。如果doMC导致了这种情况,有没有办法阻止doMC僵尸进程的发展呢?stopCluster()因为首先没有创建任何集群,所以该方法不起作用。)

> sessionInfo()
R Under development (unstable) (2014-08-16 r66404)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_IE.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_IE.UTF-8        LC_COLLATE=en_IE.UTF-8    
 [5] LC_MONETARY=en_IE.UTF-8    LC_MESSAGES=en_IE.UTF-8   
 [7] LC_PAPER=en_IE.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_IE.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
[1] doParallel_1.0.8 doMC_1.3.3       iterators_1.0.7  foreach_1.4.2   

loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_3.2.0
里奇·卡拉威(Rich Calaway)

这确实与foreach或doMC无关;正如史蒂夫·韦斯顿(Steve Weston)在回答其他StackOverflow查询时所指出的那样,doMC本质上只是mclapply的包装器,您可以看到通过简单调用mclapply创建的僵尸进程:

library(parallel)
mclapply(rep(5,4), rnorm)

在我的系统上,这留下了两个僵尸进程:

[richcalaway@richcalaway-pc ~]$ ps -efl | grep defunct
1 Z 1660945517 28701 28624  0 77  0 -     0 exit   12:00 pts/1    00:00:00 [R] <defunct>
1 Z 1660945517 28702 28624  0 78  0 -     0 exit   12:00 pts/1    00:00:00 [R] <defunct>
0 S 1660945517 28704 28308  0 78  0 - 15306 pipe_w 12:00 pts/2    00:00:00 grep defunct

通常情况下,这些僵尸进程不会造成任何麻烦,并且在R会话结束时它们确实会消失。您可以通过使用doParallel和fork群集而不使用doMC来避免它们。

干杯,

里奇·卡拉威(Rich Calaway)

首席项目经理

革命分析

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何找到僵尸进程?

来自分类Dev

您如何识别僵尸进程?

来自分类Dev

如何找到僵尸进程的成因?

来自分类Dev

您如何找到僵尸进程的父进程?

来自分类Dev

R并行计算和僵尸进程

来自分类Dev

运行命令时如何避免僵尸进程?

来自分类Dev

如何使用wait()杀死僵尸进程

来自分类Dev

Linux如何处理僵尸进程

来自分类Dev

运行命令时如何避免僵尸进程?

来自分类Dev

使用EA的Java Automation接口后如何摆脱僵尸进程?

来自分类Dev

如何杀死由多处理模块创建的僵尸进程?

来自分类Dev

僵尸进程(如何使用JFrame正确退出游戏?)

来自分类Dev

如何使用bash在docker容器中获得僵尸进程

来自分类Dev

父母去世时如何处理僵尸进程?

来自分类Dev

什么是僵尸进程?

来自分类Dev

创建僵尸进程

来自分类Dev

什么是僵尸进程?

来自分类Dev

Bootchart僵尸进程udevadm

来自分类Dev

删除僵尸进程

来自分类Dev

僵尸进程vs孤儿进程

来自分类Dev

python多进程僵尸进程

来自分类Dev

如何找出阻止卸载的进程?

来自分类Dev

Golang:子进程变成僵尸

来自分类Dev

使用100%CPU的僵尸进程

来自分类Dev

奇怪的僵尸进程响应信号?

来自分类Dev

子进程自杀,但成为僵尸

来自分类Dev

僵尸进程和退出 init

来自分类Dev

如何确定哪些进程阻止了设备的卸载?

来自分类Dev

我如何获得一个不是我的孩子的僵尸进程?