如何在引发错误时停止并行循环

时间:2018-04-08 14:45:54

标签: r error-handling parallel-processing future

我使用future包创建并行循环。有时,表达式会引发错误。在这种情况下,整个过程都会运行(需要很长时间),而且只有在评估期货时,函数才会失败。

相反,当引发错误时,该函数应该失败。特别是如果在过程开始时引发错误。例如,此代码仅在100次迭代后才会失败,但实际上可能在第10次迭代之前失败。

g = function()
{
  future::plan(future::multiprocess, workers = 4)

  x = vector("list", 100)
  for(i in 1:100)
  {
    x[[i]] = future::future(
    {
        u = runif(1, 0, 100)
        if (u > 80) 
          stop("Error")
        return(u)
    })

    cat(sprintf("\rProgress: %g%%", i, file = stderr()))
  }

  return(future::values(x))
}

如何使用future管理错误处理?

1 个答案:

答案 0 :(得分:1)

我相信您需要做的就是设置earlySignal = TRUE,如下所示:

   g = function()
{
  future::plan(future::multiprocess, earlySignal = TRUE, workers = 4)

  x = vector("list", 100)
  for(i in 1:100)
  {
    x[[i]] = future::future(
      {
        u = runif(1, 0, 100)
        if (u > 80) 
          stop("Error")
        return(u)
      })

    cat(sprintf("\rProgress: %g%%", i, file = stderr()))
  }

  return(future::values(x))
}

g()