具有共享 stderr 重定向的多会话并行性

Multisession parallelism with a shared stderr redirect

我正在尝试 运行 具有多会话并行性的 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

编辑

鉴于一些回复,我应该详细说明此 post 的目的。我正在开发 drake, an R package with multiple parallel backends. Today, I implemented a new hook argument to make(), which just wraps individual parallel jobs in a function of the user's choice。我真正想要的是一个 hook 可以使控制台静音,而不管并行后端如何。当前开发版本中的后端包括

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

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

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

可以只用sink吗?:

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)