如何在出现错误时停止并行循环
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()
我使用 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()