如何使用并行关闭打开的 R 集群连接

How to shut down an open R cluster connection using parallel

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

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

# 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

这个问题非常令人沮丧,我们将不胜感激。

使用

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