限制 clusterMap 中每个子问题的计算时间(R 并行包)

limiting computation time for each subproblem in clusterMap (R parallel package)

我需要 运行 对一系列输入参数进行 运行 次不同的任务。我使用 parallel::clusterMap() 与动态调度并行执行此操作。有时计算时间对于单个问题是不可行的。有没有办法在某个预定义的时间限制后终止集群并仍然检索已完成的任务?

如果我简单地设置超时参数,集群就会被终止,而不会检索已经完成的任务。最小示例(不工作!):

f <- function(t) {Sys.sleep(t); return(t)}
t <- c(1, 1, 2, 15, 2, 1, 3, 4, 1, 1, 1,3)
cl <- makeCluster(3, timeout = 5)
as.numeric(clusterMap(cl, f, t, .scheduling = "dynamic"))
stopCluster(cl)

我不会杀死工人,而是让工人在一段时间后自行停止。

这里有一个非常接近您发布的代码的示例:每个工作人员处于活动状态 t 秒,但不超过 4 秒。 t 或 4 秒后,它停止并且 returns 到目前为止所做的事情:

f <- function(t) {
  executionTime <- 0
  while(executionTime < t & executionTime < 4) {
    executionTime <- executionTime + 1
    Sys.sleep(1)
  }
  return(executionTime)
}
t <- c(1, 1, 2, 15, 2, 1, 3, 4, 1, 1, 1,3)


cl <- makeCluster(3)
print(as.numeric(clusterMap(cl, f, t, .scheduling = "dynamic")))
stopCluster(cl)

# [1] 1 1 2 4 2 1 3 4 1 1 1 3

注意第四个元素是 4,而不是 15。工人迭代 4 次/4 秒,然后停止并返回 4。