【问题标题】:Do something only in firs step of for loop in parallel仅在 for 循环的第一步并行执行某些操作
【发布时间】:2018-11-15 13:03:41
【问题描述】:

我想在 for 循环的第一步中执行命令,并在同一个 for 循环的所有步骤中执行其他命令列表。在非并行循环中很容易做到这一点:

for (i in 1:5) {
  if (i == 1) {
    print("First step")
  }
  print("Same code")
}

但我想并行执行for循环,即写foreach循环,这意味着i对于所有节点(进程)不会等于1。非并行foreach循环是:

library(foreach)
foreach(i = 1:5) %do% {
  if (i == 1) {
    print("First step")
  }
  print("Same code")
}

如何在每个节点的第一步中执行print("First")

【问题讨论】:

  • 只执行第一步然后才并行化怎么样?
  • 我认为这行不通,因为最后我必须在 Azure 批处理上执行这段代码,所以一切都应该在一个 foreachloop 中。
  • 嗯,我不太清楚。您始终可以创建一个仅包含一个步骤的循环。我想你应该更好地描述你的需求。
  • 我需要 n 个步骤的循环,而不是一个。但是应该只在第一步中执行几行代码,而在所有步骤中都应该执行其他代码。一切都应该在一个 for(each) 循环中并并行执行(这意味着对于某些进程,首先 i 将是 2、3 等)。更具体地说,我需要在第一步中使用 RSelenium 设置 Web 驱动程序,而不是在所有其他步骤中使用它,但我认为第一步的代码是什么并不重要?

标签: r for-loop foreach parallel-processing


【解决方案1】:

你可以这样做:

library(doParallel)
registerDoParallel(cl <- makeCluster(3, outfile = ""))
do_print <- TRUE
foreach(i = 1:5) %dopar% {
  if (do_print) {
    print("First step")
    do_print <- FALSE
  }
  print("Same code")
}
stopCluster(cl)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多