代码之家  ›  专栏  ›  技术社区  ›  JRR

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

  •  0
  • JRR  · 技术社区  · 6 年前

    我使用 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))
    }
    

    如何使用管理错误处理 将来 ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ian Wesley    6 年前

    我相信你所需要做的就是 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()