具有共享 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
可以使控制台静音,而不管并行后端如何。当前开发版本中的后端包括
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
后端的同一个文件中。
可以只用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)
我正在尝试 运行 具有多会话并行性的 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
可以使控制台静音,而不管并行后端如何。当前开发版本中的后端包括
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
后端的同一个文件中。
可以只用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)