【问题标题】:How to kill a doMC worker when it's done?完成后如何杀死 doMC 工作人员?
【发布时间】:2014-03-12 14:25:18
【问题描述】:

doMC 的文档似乎很稀疏,只列出了 doMC-package 和 registerDoMC()。我遇到的问题是我将通过 doMC/foreach 产生几个工人,但是当工作完成后,他们只是坐在那里占用内存。我可以去寻找他们的进程ID,但我经常意外杀死主进程。

library(doMC)
library(foreach)

registerDoMC(32)

foreach(i=1:32) %dopar% foo()

##kill command here?

我已尝试使用 registerDoSEQ() 进行跟踪,但它似乎并没有终止进程。

【问题讨论】:

  • 可能parallel::stopCluster 可能会这样做,但我对doMC 没有任何经验
  • 查看doMC 帮助页面中的所有可怕警告,我建议改用其他集群包。

标签: r foreach parallel-processing domc


【解决方案1】:

doMC 包基本上是 mclapply 函数的包装器,mclapply 派生了应该在返回之前退出的工作程序。它不使用像 snow 包或并行包中的 snow 派生函数这样的持久化 worker,因此它不需要像 stopCluster 这样的函数来关闭 worker。

您在直接使用 mclapply 时是否遇到同样的问题?当您调用具有较小内核值的 registerDoMC 时,它会更好地工作吗?

您是否在 Mac 上使用 RStudio 或 R.app 等 IDE 中的 doMC?如果是这样,您可能想尝试从终端使用 R 来查看是否有所作为。在 IDE 中调用 fork 可能会出现问题。

【讨论】:

    【解决方案2】:

    我从来没有为 doMC 找到合适的解决方案,所以有一段时间我一直在做以下事情:

    library(doParallel)
    cl <- makePSOCKcluster(4) # number of cores to use
    registerDoParallel(cl)
    
    ## computation
    
    stopCluster(cl)
    

    每次都有效。

    【讨论】:

      【解决方案3】:

      如果您使用 doParallel 包,并使用带有数字的 registerDoParallel(8) 您可以使用unloadNamespace("doParallel") 杀死多进程

      如果您有集群的名称,您可以使用 stopCluster(cl) 删除额外的工作人员

      【讨论】:

        【解决方案4】:

        通过使用 registerDoSEQ() 您只需注册顺序工作者,因此所有并行工作者都应该停止。这不是一个完整的解决方案,但在某些情况下应该可以工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          相关资源
          最近更新 更多