0

这里的问题中,OP 提到了使用kill来停止每个单独的进程,因为我不知道如果你在 Windows 10 上的 R Studio 中并行运行它时按下“停止”,连接仍然打开,就像我的傻瓜一样尝试运行相同的东西 4-5 次,所以现在我可怜的 3 核机器上大约有 15 个打开的连接,它们偷走了我所有的 CPU。我可以重新启动我的 R,但随后我必须回收所有这些未保存的对象,这将花费一个小时,我不想浪费时间。同样,链接帖子中的答案很好,但所有这些都是关于如何防止将来出现问题,而不是在遇到问题时如何实际解决问题。

所以我正在寻找类似的东西:

# causes problem
lapply(c('doParallel','doSNOW'), library, character.only = TRUE)
n_c <- detectCores()-1
cl<- makeCluster(n_c)
registerDoSNOW(cl)
stop()
stopCluster(cl)  #not reached

# so to close off the connection we use something like
a <- showConnections()
cls$description %>% kill

这个问题非常令人沮丧,任何帮助将不胜感激。

4

1 回答 1

2

采用

autoStopCluster <- function(cl) {
  stopifnot(inherits(cl, "cluster"))
  env <- new.env()
  env$cluster <- cl
  attr(cl, "gcMe") <- env
  reg.finalizer(env, function(e) {
    message("Finalizing cluster ...")
    message(capture.output(print(e$cluster)))
    try(parallel::stopCluster(e$cluster), silent = FALSE)
    message("Finalizing cluster ... done")
  })
  cl
}

然后将您的集群设置为:

cl <- autoStopCluster(makeCluster(n_c))

当垃圾收集时,不再可访问的旧集群对象将自动停止。您可以通过调用来触发垃圾收集器gc()。例如,如果您调用:

cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
gc()

并观察您的操作系统进程监视器,您会看到许多工作人员正在启动,但最终当垃圾收集器运行时,只剩下最新的集群工作人员集。

编辑 2018-09-05:添加了调试输出消息以显示注册的终结器何时运行,这在垃圾收集器运行时发生。如果您希望它完全静音,请删除这些message()行并使用。silent = TRUE

于 2018-09-05T19:38:38.007 回答