如何在出现错误时停止并行循环

How to stop a parallel loop when an error has been raised

我使用 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 管理错误处理?

我相信您只需将 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()