在R中执行将来的包会导致无休止的等待时间

时间:2018-01-06 20:50:12

标签: r asynchronous parallel-processing cluster-computing future

我对未来的套餐有疑问。在我的任务中,我尝试设置一个异步过程。我是用Futures做的。如果我第一次运行我的脚本(在一个干净的RSession中)一切正常,并按预期工作。在同一个R Session中第二次运行相同的功能,在无休止的等待时间内结束。执行在期货开始的行中停止。没有错误被抛出。守则只是永远运行。如果我手动中断代码,则从该行调用浏览器: Sys.sleep(间隔)。 通过以下方式执行此操作的呼叫来自: 来自:socketSelect(list(con),write = FALSE,timeout = timeout)。

我编写了一个小程序,它的结构与我的脚本基本相同,并且会出现同样的问题。虽然在这个小例子中并不明显,但这个结构在我的原始代码中有一些优势:

 library(future)
library(parallel)

asynchronousfunction <- function(){

 Threads.2.start <- availableCores()
 cl <- parallel::makePSOCKcluster(Threads.2.start)
 plan(cluster, workers = cl)

 threads <- lapply(1:Threads.2.start, function(index){
   future::cluster({Sys.getpid()},persistent = TRUE, workers = cl[[index]])
 })

 while(!any(resolved(threads))){

    Sys.sleep(0.1)

 }

 threads <- lapply(1:Threads.2.start, function(index){
   future::cluster({Sys.getpid()},persistent = TRUE, workers = cl[[index]])
 })

 stopCluster(cl = cl)

}


asynchronousfunction() # First call to the function. Everything is working fine.
asynchronousfunction() #Second call to the function. Endless Execution.

我正在使用Windows 10,R版本是3.4.2。包版本是1.6.2。

我希望你们能帮助我。

提前致谢。

最诚挚的问候,

哈佛

1 个答案:

答案 0 :(得分:1)

作者future在这里。看起来你已经试图过度使用它,我并不是100%肯定你想要实现的目标。对我来说可疑的事情是你使用:

  • cluster() - 请致电future()
  • cluster(..., workers = cl[[index]]) - 在设置未来时不要指定workers
  • 您是否有理由要使用persistent = TRUE
  • resolve(threads)基本上与您的while()循环相同。
  • 您没有收集期货的价值,即您没有致电value()values()
  • 要进行问题排查,您可以通过设置option(future.debug = TRUE)获取有关幕后内容的详细信息。

如果我将您的示例重写为现在的示例,那么一个工作示例将如下所示:

library("future")

asynchronousfunction <- function() {
  n <- availableCores()
  cl <- makeClusterPSOCK(n)
  plan(cluster, workers = cl)

  fs <- lapply(1:n, function(index) {
    future({ Sys.getpid() }, persistent = TRUE)
  })

  ## Can be replaced by resolve(fs)
  while(!any(resolved(fs))) {
    Sys.sleep(0.1)
  }

  fs <- lapply(1:n, function(index) {
    future({ Sys.getpid() }, persistent = TRUE)
  })

  parallel::stopCluster(cl = cl)
}

您可以使用lapply(),而不是滚动自己的future() + future_lapply()吗?例如,

asynchronousfunction <- function() {
  n <- availableCores()
  cl <- makeClusterPSOCK(n)
  plan(cluster, workers = cl)

  pids <- future_lapply(1:n, function(ii) {
    Sys.getpid()
  })
  str(pids)

  pids <- future_lapply(1:n, function(ii) {
    Sys.getpid()
  })
  str(pids)

  parallel::stopCluster(cl = cl)
}