【发布时间】:2013-11-01 08:43:12
【问题描述】:
我想在每个doParallel 线程中执行一个tclTaskSchedule 计时器(来自tcltk2 包)。但是,以下最小代码
library(doParallel)
n <- detectCores()
cl <- makeCluster(n, outfile="out.log")
registerDoParallel(cl)
testfn <- function() print(paste("hello from", i))
foreach(i=1:n, .packages = c("tcltk", "tcltk2"), .verbose = T) %dopar% {
tclTaskSchedule(1000, testfn(), id = paste0("task", i), redo = 10)
}
stopCluster(cl)
导致错误(在控制台打印不是,而是在out.log)
Error in eval(expr, envir, enclos) : could not find function "testfn"
但是,从 .verbose = T 参数中,我可以从控制台看到 testfn 正在导出:
automatically exporting the following variables from the local environment:
testfn
确实,用.export = "testfn" 调用foreach 会导致同样的错误。
那么到底出了什么问题?
(我为什么要这样做?最后,我想在一定的时间间隔异步地poll多个数据源,并且每个数据源都有自己特定的轮询间隔)
【问题讨论】:
-
我相信问题不在于
dopar,而在于tclTaskSchedule,它对环境有一些内在的魔力。如果您只将print(testfn)放入foreach循环中,您将看到该函数是在worker 上定义的。然而,不知何故tclTaskSchedule在错误的环境中寻找它。我尝试了一些东西,但找不到解决此问题的方法。 PS:如果你在没有并行化的情况下运行循环,你会发现你也有延迟评估的问题。
标签: r timer foreach parallel-processing polling