R功能范围和并行性

时间:2017-10-06 09:59:54

标签: r function parallel-processing scope

考虑以下功能定义

library(doParallel)
f_print <- function(x)
{
  print(x)
}
f_foreach <- function(l)
{
  foreach (i=l) %do%
  {
    f_print(i)
  }
}

f_foreach_parallel <- function(l)
{
  doParallel::registerDoParallel(1)
  foreach (i=l) %dopar%
  {
    f_print(i)
  }
}

功能用途:

> f_foreach(c(1,2))
[1] 1
[1] 2
[[1]]
[1] 1

[[2]]
[1] 2

> f_foreach_parallel(c(1,2))
 Show Traceback

 Rerun with Debug
 Error in { : 
  task 1 failed - "impossible de trouver la fonction "f_print"" 
  [Error: could not find function f_print]
> 

f_print()涉及并行性时,您能帮助解释为什么foreach不可见吗?我们如何在此并列f_print()中使用foreach?与此相关的任何文档?

1 个答案:

答案 0 :(得分:0)

除了顶级帖子的评论中已经说过的内容,特别是关于指定.export的评论,在使用doFuture包时,无论并行后端如何,您的代码都能正常运行系统和.export。以下是您的设置的改编版本:

f_print <- function(x) {
  print(x)
}

f_foreach <- function(l) {
  foreach(i=l) %do% {
    f_print(i)
  }
}

f_foreach_dopar <- function(l) {
  foreach(i=l) %dopar% {
    f_print(i)
  }
}

而不是:

library("doParallel")

## Setup PSOCK workers (just as on Windows)
workers <- parallel::makeCluster(1L, outfile = "")
registerDoParallel(workers)

f_foreach_dopar(c(1,2))
## Error in { : task 1 failed - "could not find function "f_print""

你可以这样做:

library("doFuture")
registerDoFuture()

## As above
workers <- parallel::makeCluster(1L, outfile = "")
plan(cluster, workers = workers)

f_foreach_dopar(c(1,2))
## [1] 1
## [1] 2
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2

这样做的原因是doFuture进行了更彻底的搜索来识别全局变量(这里是f_print())。

PS。 outfile = ""的原因是实际显示stdout / stderr输出(例如来自print())。在并行处理中重定向stdout / stderr,我不推荐,这是一个完全不同的讨论,但我假设您仅使用print()作为您的示例。