具有共享stderr重定向的多区段并行性

时间:2017-10-26 19:46:47

标签: r parallel-processing rparallel

我正在尝试使用多会话并行运行R代码,以便将所有错误消息重定向到同一文件。但是,无法创建sink()

library(parallel)
cl <- makePSOCKcluster(2)
f <- function(){
  withr::with_message_sink("messages.txt", Sys.sleep(10))
}
clusterCall(cl = cl, fun = f)

## Error in checkForRemoteErrors(lapply(cl, recvResult)) :
##   2 nodes produced errors; first error: Cannot establish message sink when another sink is active.
## Calls: clusterCall -> checkForRemoteErrors
## Execution halted

修改

鉴于一些答复,我应该详细说明这篇文章的目的。我正在开发drake,一个包含多个并行后端的R包。今天,我实施了一个新的hook argumentmake()wraps individual parallel jobs只有function of the user's choice。我真正想要的是hook,无论并行后端如何,它都会使控制台静音。当前开发版本中的后端包括

  • parallel::mclapply()
  • parallel::parLapply()
  • base::lapply()(通过parLapply()获得一份工作)
  • make -j使用正确的Makefile
  • future::sequential
  • future::multicore
  • future::multisession
  • future.batchtools backends listed here

我以为我找到了一个适用于stderr的hook

hook <- function(){
  withr::with_message_sink("messages.txt", Sys.sleep(10))
}

但是,withr::with_message_sink()不允许我将多个工作人员归入parLapply()future::multisession后端的同一文件中。

1 个答案:

答案 0 :(得分:1)

你能用水槽吗?:

library(parallel)
cl <- makePSOCKcluster(2)
clusterApply(cl, seq_along(cl), function(i) workerID <<- i)


f <- function(){
  outtxt <- paste(workerID, "messages.txt", sep="_")
  print(outtxt)
  sink(outtxt)
  Sys.sleep(10)
  sink()
}
clusterCall(cl = cl, fun = f)

stopCluster(cl)